STAP STAP

STAP = (動詞)スタップする、カシャカシャする(造語)
 

スポンサーサイト 

No. : --/--/--(--) --:--:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

マーシャリングではまる 

No.317 : 2008/12/20(Sat) 17:11:29
今 Sinku.dll を C# から使おうと努力してるんですが…
Sinku.dll はネイティブで書かれた DLL ですから、マネージド環境から使おうと思ったら
一工夫いるわけです。
まぁ C# のシの字くらいまでしか分かってない俺が挑戦したわけですが、マーシャリングで
はまりましたorz

Sinku.dll には FILE_INFO という構造体があって、その中に動画情報が格納されます。
FILE_INFO 構造体は

typedef struct {
char name[STR_MAX_LENGTH]; //IN : ファイル名
int type; //IN/OUT : ファイル種別
char container[32]; //OUT : コンテナ名(ある場合のみ)
char error[STR_MAX_LENGTH]; //OUT : エラー(ある場合のみ)
char video[VA_MAX_STREAM_COUNT][STR_MAX_LENGTH]; //OUT : 映像の詳細
int video_count; //OUT : 映像の詳細の数
char audio[VA_MAX_STREAM_COUNT][STR_MAX_LENGTH]; //OUT : 音声の詳細
int audio_count; //OUT : 音声の詳細の数
char extra[EX_MAX_STREAM_COUNT][STR_MAX_LENGTH]; //OUT : 付属情報
int extra_count; //OUT : 付属情報の数
double playtime; //OUT : 再生時間(秒)
unsigned __int64 size; //OUT : ファイルサイズ
} FILE_INFO;


こうなっています。
マーシャリングではまったのが 3 つある二次元配列。
ここには最大 10 個のビデオとオーディオのストリームに関する情報が格納されます。
extra は MPEG2-TS かなんかに使うみたいで、最大 5 個です。
これをどうやってもクリアできない。

char の一次元配列(要するに文字列)は

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = STR_MAX_LENGTH)]
public string Name;

などとすればOKです(STR_MAX_LENGH は Sinku.h に書いてありますが 512 です)。
でも二次元配列はさっぱり。
ArraySubType に Unmanaged.LPTstr とか色々入れてみましたが、Type なんちゃら Exception でそんなの使えないぞゴルァとか深刻そうな Exception 等が発生してお手上げ状態。
あきらめて以下のようにしました。

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = STR_MAX_LENGTH)]
public string Video1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = STR_MAX_LENGTH)]
public string Video2;
・・・
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = STR_MAX_LENGTH)]
public string Video10;

強引な力技です。配置さえあってりゃいいんですよ!HSP で構造体を扱うときもそうでした。

まぁコンテナ名や長さの取得はできましたが上に書いた Video や Audio の値は「C空VIDEO」や「C空LAME」などという謎文字列になってしまったので・・・謎です。

まぁ今回は PlayTime が取得できれば良しなのであきらめます。
最後に、「続きを読む」に俺が書いたクソコードを提示しておきます。
C# は深いなぁ。どなたか分かる方いらっしゃいましたら教えてください。


黒羽さんに Sinku.dll を .NET で書き直してもらうのが一番早(ry

using System;
using System.Text;
using System.Runtime.InteropServices;

namespace SinkuHadouken
{
public class SinkuConst
{
public const int STR_MAX_LENGTH = 512;
public const int VA_MAX_STREAM_COUNT = 10;
public const int EX_MAX_STREAM_COUNT = 5;
}

public class Sinku
{
[DllImport("Sinku.dll")]
extern static int GetDllVersion();

[DllImport("Sinku.dll")]
extern static void SetPath(string path);

[DllImport("Sinku.dll")]
extern static void GetFileFormat(ref SinkuFileInfo fileInfo);

[DllImport("Sinku.dll")]
extern static void GetFileInfo(ref SinkuFileInfo fileInfo);

[DllImport("Sinku.dll")]
extern static void GetFileInfoAuto(ref SinkuFileInfo fileInfo);

[DllImport("sinku.dll")]
extern static void ConvertFull(ref SinkuFileInfo fileInfo, StringBuilder str);

[DllImport("sinku.dll")]
extern static void ConvertOne(ref SinkuFileInfo fileInfo, StringBuilder str);

public SinkuFileInfo GetFileFormat(string path)
{
SinkuFileInfo fileInfo = new SinkuFileInfo();
fileInfo.Name = path;
GetFileInfoAuto(ref fileInfo);
return fileInfo;
}
}

[StructLayout(LayoutKind.Sequential, Pack=4)]
public struct SinkuFileInfo
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Name;
public int Type;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string Container;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Error;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Video1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Video2;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Video3;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Video4;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Video5;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Video6;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Video7;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Video8;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Video9;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Video10;
public int VideoCount;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Audio1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Audio2;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Audio3;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Audio4;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Audio5;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Audio6;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Audio7;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Audio8;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Audio9;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Audio10;
public int AudioCount;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Extra1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Extra2;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Extra3;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Extra4;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = SinkuConst.STR_MAX_LENGTH)]
public string Extra5;
public int ExtraCount;
public double PlayTime;
public UInt64 Size;
}
}
スポンサーサイト
タイトルなし | HOME | Vector のソフト登録が不便

COMMENT

はじめまして
ここに書いていいものか悩みましたが失礼して書かせて頂きます。
このサイトでChaosHeadのNODVD化パッチをダウンロードさせて頂いたところ、どうもファイルが開けません。一瞬ウィンドウが表示されるものの、すぐに消えてしまいます。いきなりで恐縮ですが、解決策を教えてもらえないでしょうか。
2008/12/25(木) 16:35:25 | URL | Ryo #YJSNPkbQ [Edit]
Re: タイトルなし
はじめまして。
CHAOS; HEAD のパッチですが、多分完了しています。
DVDを抜いて起動してみてください。

DVDを挿入を要求される(パッチ当てに失敗している)場合は、コマンドプロンプトから実行ファイルを起動してみてください。何らかのエラーが表示されるはずです。コマンドプロンプトの使い方等は申し訳ありませんがググってみてください。
2008/12/25(木) 18:49:27 | URL | エイチム #- [Edit]
承認待ちコメント
このコメントは管理者の承認待ちです
2010/01/24(日) 12:20:02 | | # [Edit]

COMMENT FORM


TO SECRET
 

TRACKBACK URL to this Entry

TRACKBACK to this Entry

| HOME |

calendar

S M T W T F S
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
03« 2017/04 »05

Profile

エイチム

Author:エイチム
programmingに
興味を示す高専生

Diary

Recent Comments

Archives

Category

Link

このブログをリンクに追加する

RSS


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。