ActiveX DLLを呼び出すには?

解決


COM  2007-01-17 10:40:17  No: 64234  IP: 192.*.*.*

こんにちは。
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;
}

以上、宜しくお願いします。

編集 削除
επιστημη  URL  2007-01-17 11:15:59  No: 64235  IP: 192.*.*.*

> ::CoCreateInstance関数の返り値が、どうしても
> 「0x80040154 クラスが登録されていません」という結果になります。

…登録されてないんじゃないですか?
同じディレクトリに置くだけで使えるものなのですか?

編集 削除
2リットル  2007-01-17 11:34:45  No: 64236  IP: 192.*.*.*

すばりかどうかはわかりませんが…
regsvr32などを調べてみてはいかがでしょうか?。

編集 削除
COM  2007-01-17 11:36:46  No: 64237  IP: 192.*.*.*

επιστημηさん、回答ありがとうございます。

「クラス登録する」とは具体的にどのような作業をすればよいのでしょうか?
DLLの呼び出しは、実行ファイルと同じディレクトリにあれば呼び出せる
と思っていたのですが。
すみません、素人なのでご教授願います。

編集 削除
επιστημη  URL  2007-01-17 14:30:51  No: 64238  IP: 192.*.*.*

> DLLの呼び出しは、実行ファイルと同じディレクトリにあれば呼び出せる
と思っていたのですが。

フツーのDLLはそうですが、ActiveX-DLLは登録が必要でしょう。

2リットルさんのご指摘通り、regsvr32かなんかで登録するんでしょうね。

編集 削除
COM  2007-01-17 14:50:14  No: 64239  IP: 192.*.*.*

ActiveX DLLは上記のような登録が必要なんですね。
コマンドプロンプトでregsvr32を使用したら、
上手く実行できました。

επιστημηさん、2リットルさん、ご指摘ありがとうございました。

編集 削除