こんにちは。
Visual Basic 6.0のActiveX DLLとして作成したCOMコンポーネントを、
C言語クライアントからアクセスしようと試みています。
DLLファイル名は"Project1.dll"で、C言語で作成した呼び出し用の
exeファイルと同じ場所に置いています。
ActiveX DLLの概要は以下の通りです。
プロジェクトの種類:ActiveX DLL
プロジェクト名:Project1
クラスモジュール名:Class1
'メソッドCalc
Public Function Calc(ByVal x As Long, ByVal y As Long) As Long
Calc = x + y
End Function
C言語からは以下のプログラムにて呼び出そうとしていますが、
::CoCreateInstance関数の返り値が、どうしても
「0x80040154 クラスが登録されていません」という結果になります。
何が原因なのかご教授お願いします。
ちなみにC言語の環境は、Visual C++.NET(2003)です。
#include "stdio.h"
#include "windows.h"
#include "objbase.h"
#import "project1.dll" no_namespace named_guids raw_interfaces_only
int main(int argc, char* argv[])
{
long x, y, z;
HRESULT hResult;
_Class1* pClass1;
::CoInitialize(0);
hResult = ::CoCreateInstance((REFCLSID)CLSID_Class1, 0,
CLSCTX_INPROC_SERVER,
(REFIID)IID__Class1,
(LPVOID*)&pClass1);
if( ! SUCCEEDED(hResult) ) {
printf("ERROR occured = %08x\n", hResult);
return 0;
}
x = 10; y = 20;
pClass1->Calc( x, y, &z );
printf("Result = %d\n", z );
pClass1->Release();
::CoUninitialize();
return 0;
}
以上、宜しくお願いします。
> ::CoCreateInstance関数の返り値が、どうしても
> 「0x80040154 クラスが登録されていません」という結果になります。
…登録されてないんじゃないですか?
同じディレクトリに置くだけで使えるものなのですか?
すばりかどうかはわかりませんが…
regsvr32などを調べてみてはいかがでしょうか?。
επιστημηさん、回答ありがとうございます。
「クラス登録する」とは具体的にどのような作業をすればよいのでしょうか?
DLLの呼び出しは、実行ファイルと同じディレクトリにあれば呼び出せる
と思っていたのですが。
すみません、素人なのでご教授願います。
> DLLの呼び出しは、実行ファイルと同じディレクトリにあれば呼び出せる
と思っていたのですが。
フツーのDLLはそうですが、ActiveX-DLLは登録が必要でしょう。
2リットルさんのご指摘通り、regsvr32かなんかで登録するんでしょうね。
ActiveX DLLは上記のような登録が必要なんですね。
コマンドプロンプトでregsvr32を使用したら、
上手く実行できました。
επιστημηさん、2リットルさん、ご指摘ありがとうございました。
ツイート | ![]() |