C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: COMメソッド呼び出しでNULL引数を渡したい


(過去ログ 48 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■26380 / inTopicNo.1)  COMメソッド呼び出しでNULL引数を渡したい
  
□投稿者/ うどん (1回)-(2008/10/08(Wed) 00:30:59)

分類:[C#] 

[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214E6-0000-0000-C000-000000000046")]
private interface IShellFolder
{
    [PreserveSig]
    int ParseDisplayName(IntPtr hwnd, IntPtr pbc, [In, MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName,
                         out uint pchEaten, out ItemIDList ppidl, ref uint pdwAttributes);

-----------------

pchEatenとpdwAttributesを使う場合はこれでいいのですが、NULLを指定したい場合はどうすればいいのでしょうか?
outやref引数にnullは渡せませんよね?
普通のエクスポート関数ならオーバーロードすればいいのですが、インターフェースのメソッドの場合は駄目なようです。
Nullable型も試してみたのですが、ジェネリック型をマーシャリングすることはできませんと例外が出ました。

今は以下のようにして、pchEatenやpdwAttributesを使う場合はunsafeでポインタをとって…
とやってるのですが、unsafeを使わない方法はないですかね…

    [PreserveSig]
    int ParseDisplayName(IntPtr hwnd, IntPtr pbc, [In, MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName,
                         IntPtr pchEaten, out ItemIDList ppidl, IntPtr pdwAttributes);

引用返信 編集キー/
■26382 / inTopicNo.2)  Re[1]: COMメソッド呼び出しでNULL引数を渡したい
□投稿者/ NyaRuRu (68回)-(2008/10/08(Wed) 01:04:06)
No26380 (うどん さん) に返信
> 普通のエクスポート関数ならオーバーロードすればいいのですが、インターフェースのメソッドの場合は駄目なようです。

私の場合、以下のようにインターフェースを2バージョン用意して、nullを指定したい場合は IntPtr 版を呼ぶ方法をよく使います。

[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214E6-0000-0000-C000-000000000046")]
private interface IShellFolder
{
    [PreserveSig]
    int ParseDisplayName(IntPtr hwnd, IntPtr pbc, [In, MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName,
                         out uint pchEaten, out ItemIDList ppidl, ref uint pdwAttributes);


[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214E6-0000-0000-C000-000000000046")]
private interface IShellFolderRaw
{
    [PreserveSig]
    int ParseDisplayName(IntPtr hwnd, IntPtr pbc, [In, MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName,
                         IntPtr pchEaten, out ItemIDList ppidl, IntPtr pdwAttributes);

最近書いたものだと、以下のソースに出てくるID3DXEffectCompilerとID3DXEffectCompiler_customの関係がそれです。
http://d.hatena.ne.jp/NyaRuRu/20080813/p1
http://www.dwahan.net/nyaruru/hatena/DynamicShader.zip

引用返信 編集キー/
■26439 / inTopicNo.3)  Re[2]: COMメソッド呼び出しでNULL引数を渡したい
□投稿者/ うどん (2回)-(2008/10/08(Wed) 23:26:59)
その方法でうまく行きました。
ありがとうございました。
引用返信 編集キー/
■26440 / inTopicNo.4)  Re[3]: COMメソッド呼び出しでNULL引数を渡したい
□投稿者/ うどん (3回)-(2008/10/08(Wed) 23:27:43)
解決チェック忘れてました
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -