DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Variantの扱いについて

環境/言語:[C#]
分類:[.NET]

2008/01/17(Thu) 01:14:47 編集(投稿者)
2008/01/17(Thu) 01:14:37 編集(投稿者)

お世話になります。
TSと申します。

環境・言語
.NET 2.0 VS2005 C#

現在、IEのActiveXの処理でどのようにして良いか
分らずにおります。

IOleCommandTargetインターフェイスの、
Exexメソッドでどのようにして良いか分らずにおります。
(VC、Delphiでは動作している処理を、確認しています。)

C++の宣言
HRESULT Exec(
const GUID *pguidCmdGroup, // Pointer to command group
DWORD nCmdID, // Identifier of command to execute
DWORD nCmdExecOpt, // Options for executing the command
VARIANTARG *pvaIn, // Pointer to input arguments
VARIANTARG *pvaOut // Pointer to command output
);

C#での、インターフェースの記述(Execメソッド)
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int Exec(
[In] ref Guid pguidCmdGroup,
[In, MarshalAs(UnmanagedType.U4)] uint nCmdID,
[In, MarshalAs(UnmanagedType.U4)] uint nCmdexecopt,
[In] ref IntPtr pvaIn,
[In, Out] ref IntPtr pvaOut);

上記の記述において、
Object o1 = new object();
Object o2 = new object();
o1 = ChildMenu; //ChildMenuはIntPtr (Win32でHMENU)

IntPtr p1;
IntPtr p2;
p1 = Marshal.AllocCoTaskMem((int)200);
p2 = Marshal.AllocCoTaskMem((int)200);

Marshal.GetNativeVariantForObject(ChildMenu, p1);
Marshal.GetNativeVariantForObject(o2, p2);

int res = oct.Exec(ref ShellDocView,
SHDVID_ADDMENUEXTENSIONS,
(uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT,
ref p1,
ref p2);

//octはIOleCommandTarget
//ShellDocViewは
//Guid CGID_ShellDocView = new Guid("000214D1-0000-0000-C000-000000000046");です。
//(uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT
//は0です。
//SHDVID_ADDMENUEXTENSIONSは53で、EI逆クリックの、
//追加メニューの取得のコマンドです。

C#でのMSのサンプルにあります、IOleCommandTarget::Execでの
ダイアログの表示は正しく出来ることを確認しています。
ただ、MSのサンプルでは、
pvaIn、pvaOutのそれぞれが、object型になっています。

MSのサンプルのまま使用した場合、
(object型の変数に、メニューのハンドルなどを入れた場合)
実行時にVariantのエラーが発生します。
(エラーコードが拾えません。)

そこで、
VARIANTARG *pvaIn, // Pointer to input arguments
VARIANTARG *pvaOut // Pointer to command output
の箇所を、IntPtrにしMarshal.GetNativeVariantForObjectで
Variantに変換した後に、関数に渡しましたが、
Error -2147024809 (HRESULT 0x80070057)が発生します。

根本的に、.NETを理解していないかもしれません・・・<お恥ずかしい。

皆様のお力をいただければ幸いです。

よろしくお願い致します。
  • 題名: Re[1]: Variantの扱いについて
  • 著者: TS
  • 日時: 2008/01/19 13:56:29
  • ID: 21297
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2008/01/19(Sat) 17:36:46 編集(投稿者)
2008/01/19(Sat) 17:36:40 編集(投稿者)

お世話になります。
TSです。

色々と試しましたが、
今回の、EI逆クリック時のメニューに表示される、
追加項目を得るケースは、未だに未解決です。

他の処理の場合
IOleCommandTargetのExecは正しく動作しているようです。


今回は根本的な解決ではありませんが、
Marshal.GetIUnknownForObject メソッドを用い、
対象のインターフェイスから、IUnknownのポインタ(IntPtr)を
取得し、このポインタを、VCで作成したDLLの関数に渡し、
必要な処理を行いました。


一応「解決済み」に致します。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板