DOBON.NETプログラミング掲示板過去ログ
Variantの扱いについて
題名: Variantの扱いについて
著者: TS
日時: 2008/01/17 1:11:10
ID: 21264
この記事の返信元:
(なし)
この記事への返信:
[21297]
Re[1]: Variantの扱いについて
TS
2008/01/19 13:56:29
[解決]
ツリーを表示
環境/言語:[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
この記事の返信元:
[21264]
Variantの扱いについて
TS
2008/01/17 1:11:10
この記事への返信:
(なし)
ツリーを表示
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
|
プログラミング道
|
プログラミング掲示板
分類:[.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を理解していないかもしれません・・・<お恥ずかしい。
皆様のお力をいただければ幸いです。
よろしくお願い致します。