○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++