■14125 / inTopicNo.1) |
void * を取るDLL呼び出し時のマーシャリング |
□投稿者/ ぜぜ (1回)-(2008/02/09(Sat) 16:08:30)
|
分類:[C#]
開発環境 VisualStudio2005/Windows Vista
使用言語 C#
C#からwmvcore.dllのCOMインターフェースの呼び出しをしようとしているのですが、
マーシャリングが正しくできていないようで、例外が発生してしまいます。
「void *」を引数に取るため、その部分が問題になっているのではないかと
考え、MSDNの
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconVoidSample.asp
にあるような方法を試しているのですが、うまく行きません。
同様の経験のある方や、識者の方教えていただけますでしょうか?
以下のようなコードを書いています。
・呼び出そうとしているCOMのインターフェース ⇒ IWMIndexer2
・呼び出しで例外が上がるメソッドのC++のコード(Windows Media Format SDK)
HRESULT Configure(
WORD wStreamNum,
WMT_INDEXER_TYPE nIndexerType,
void* pvInterval,
void* pvIndexType
);
なお、Configureの注意書きとしてpvIntervalはDWORDのポインタを渡し、
pvIndexTypeはWORDのポインタを渡すとあります。
---------------- C# のコード --------------------
public class WMFWrapIndexer
{
[DllImport("wmvcore.dll",
EntryPoint = "WMCreateIndexer",
SetLastError=true,
CharSet=CharSet.Unicode,
ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
public static extern uint WMCreateIndexer(
[Out, MarshalAs(UnmanagedType.Interface)] out IWMIndexer ppMetadataEditor);
public WMFWrapIndexer()
{
}
}
[Guid("6d7cdc71-9888-11d3-8edc-00c04f6109cf"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IWMIndexer
{
uint Cancel();
uint StartIndexing(
[In, MarshalAs(UnmanagedType.LPWStr)] string pwszFilename,
[In] IntPtr pCallback,
[In] IntPtr pvContext);
}
[Guid("b70f1e42-6255-4df0-a6b9-02b212d9e2bb"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IWMIndexer2
{
uint Configure(
[In] ushort wStreamNum,
[In] WMT_INDEXER_TYPE nIndexerType,
[In, MarshalAs(UnmanagedType.AsAny)] Object pvInterval,
[In, MarshalAs(UnmanagedType.AsAny)] Object pvIndexType);
}
public enum WMT_INDEXER_TYPE
{
WMT_IT_PRESENTATION_TIME = 0,
WMT_IT_FRAME_NUMBERS = 1,
WMT_IT_TIMECODE = 2
}
============ 実際の呼び出し =========================
IWMIndexer m_wmIndexer;
IWMIndexer2 m_wmIndexer2;
uint hr;
try {
hr = WMFWrapIndexer.WMCreateIndexer(out m_wmIndexer);
if (hr != 0) {
return -1;
}
m_wmIndexer2 = (IWMIndexer2)m_wmIndexer;
uint ui_interval = 3000;
ushort us_index = 1;
hr = m_wmIndexer2.Configure(0, WMT_INDEXER_TYPE.WMT_IT_PRESENTATION_TIME, ui_interval, us_index); <==== ここでArgmentExceptionが発生(戻り値は0)
} catch (Exception e) {
return -1;
} finally {
}
============ ここまで =========================
Configureの引数を全部0にするなども試してみたのですが、
やはりArgmentExceptionが発生してしまいます。
(ref uint/ref ushortを使う方法も同様でした。)
よろしくお願いします。
|
|