○SDK ActiveX(COM)の呼び出し
ActiveX DLL EXEどちらでも、動作します。
もちろんVB6で作られたものでも、COMであれば使用できます。
■呼び出すActiveX.dll
ATLで作成されており以下のメソッドを持っています
C:\○○○.dll の場所で名前でレジストリに登録されています。
LONG val;
STDMETHODIMP Cclass1::get_add(LONG* pVal)
{
*pVal=val+1;
return S_OK;
}
STDMETHODIMP Cclass1::put_add(LONG newVal)
{
val=newVal;
return S_OK;
}
■上のActiveXの読み出し
@コンパイラによるラッパークラスの作成
#import "c:\○○○.dll" no_namespace,named_guids
COMの名前と場所を直接指定します。
先頭にこの一文を先頭に書いて、ビルドします。そうすると、
実行ファイルの作成されるフォルダに、○○○.tlh というファイルが作成されます。
A宣言の確認
○○○.tlh を開いてください
▽スマートポインタの宣言を確認します。
下のを見ると、Iclass1で宣言されていることが解ります。後ろに Ptr を付けたのがスマートポインタの名前です。
つまり、スマートポインタ名は、 Iclass1Ptr です。
//
// Smart pointer typedef declarations
//
_COM_SMARTPTR_TYPEDEF(Iclass1, __uuidof(Iclass1));
▽GUIDの変数名を確認します
CLSID_???と宣言されているものを探します。
下のでは、CLSID_Cclass1 です。
//
// Named GUID constants initializations
//
extern "C" const GUID __declspec(selectany) LIBID_str =
{0x8a258e3b,0x1a30,0x413d,{0xad,0x51,0x43,0x28,0x03,0x49,0x38,0x06}};
extern "C" const GUID __declspec(selectany) CLSID_Cclass1 =
{0xcc02f322,0x1c13,0x4a4b,{0x9b,0xcf,0xc0,0x81,0x2f,0x10,0x92,0x0f}};
extern "C" const GUID __declspec(selectany) IID_Iclass1 =
{0xe6b6519e,0x8332,0x49ea,{0x9e,0x47,0x73,0x3d,0x2d,0xda,0xbf,0xcc}};
Bラッパークラスを使用した読み出し
CoInitialize(NULL);//読み出すスレッドごとに必ず必要
Iclass1Ptr test;//上のスマートポインタの変数を作成します
if(!FAILED(test.CreateInstance(CLSID_Cclass1))){//上のCLSIDを入れてインスタンスの作成
test->add = 10; //後はポインタのように、ActiveXのメソッドを利用できます。
printf("%ld\n",test->add);
}else{
//エラー処理
}
■読み出し例
#include <stdio.h>
#include <windows.h>
#import "c:\○○○.dll" no_namespace,named_guids
int main(char* argv[]){
CoInitialize(NULL);//読み出すスレッドごとに必ず必要
Iclass1Ptr test;
if(!FAILED(test.CreateInstance(CLSID_Cclass1))){
test->add = 10;
printf("%ld\n",test->add);
}
getchar();
return 0;
}
実行結果
11
■便利な変換ラッパークラス
▽BSTRのラッパークラスを使用した変換
//char→BSTR
char*str1 = "いなばabcd";
_bstr_t _bstr1(str1);
BSTR bstr1 = _bstr1;
//BSTR→char
_bstr_t bstrt2 = bstr1;
char*str2 = bstrt2;
▽VARIANTのラッパークラスを使用した変換
_variant_t var(int(10));
int i=int(var);
▲トップページ
>
Windows と C++