2

前回の質問からある程度の進歩で、次のプロジェクトをコンパイルする必要があります。https://stackoverflow.com/a/10949784/846550に基づいています

ただし、実行時にCoCreateInstanceの呼び出しは失敗します。HRESULTは0x80131522です-これはグーグルで、ほとんどのヒットは私が使用していないSQLサーバーに関連しているようです。

C ++コード、管理されていない

#include <iostream>
#include <atlbase.h>
#import "..\ClassLibrary1\bin\debug\ClassLibrary1.tlb" no_namespace

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ATLENSURE_SUCCEEDED(CoInitialize(NULL));

    CLSID clsid;
    _ComClass1 *t; 
    ATLENSURE_SUCCEEDED(::CoInitialize(NULL));
    ATLENSURE_SUCCEEDED(CLSIDFromProgID(OLESTR("ClassLibrary1.ComClass1"), &clsid));

    HRESULT hr = CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                                   __uuidof(_ComClass1),(LPVOID*) &t);
    ATLENSURE_SUCCEEDED(hr);

    ATLENSURE_SUCCEEDED(t->showform());
    ATLENSURE_SUCCEEDED(t->increment());

    CoUninitialize();
    return 0;
}

これが適切なDLLコードです-VBのCOMDLLクラスとしてほぼ完全に自動生成されます。(DLLは、oleviewを使用して登録されたものとして表示されます)。

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
Public Class ComClass1

#Region "COM GUIDs"
    ' These  GUIDs provide the COM identity for this class 
    ' and its COM interfaces. If you change them, existing 
    ' clients will no longer be able to access the class.
    Public Const ClassId As String = "46783a4a-5ca9-4930-addb-cde91a377c02"
    Public Const InterfaceId As String = "e2ad7298-7339-45fb-aad1-cb82188bf067"
    Public Const EventsId As String = "b7e10cdf-dc2a-4052-9b0f-f6f9d5a1f0ac"
#End Region

    ' A creatable COM class must have a Public Sub New() 
    ' with no parameters, otherwise, the class will not be 
    ' registered in the COM registry and cannot be created 
    ' via CreateObject.
    Public Sub New()
        MyBase.New()
    End Sub


    Private f1 As Form1

    Public Sub showform()
        f1 = New Form1()
        f1.Show()
    End Sub

    Public Sub increment()
        f1.ProgressBar1.Increment(5)
    End Sub

End Class
4

2 に答える 2

1

これはTypeLoadException、HRESULT 0x80131522 ですCOR_E_TYPELOAD

これは、CLR がアセンブリを見つけられなかったことを意味します。パス内の実行可能ファイルと同じディレクトリにコピーするか、GAC に登録する必要があります。

のドキュメントにREGASMは次のように書かれています:

Regasm.exe を使用してアセンブリを登録した後、それをグローバル アセンブリ キャッシュにインストールして、任意の COM クライアントからアクティブ化できるようにします。アセンブリが 1 つのアプリケーションによってのみアクティブ化される場合は、そのアプリケーションのディレクトリに配置できます。

つまり、クライアントのアプリケーション ディレクトリにインストールされているか、引数で登録されているパスにインストールされているか、GAC にインストールされていない限り作成できません/codebase。後者の 2 つはどちらも厳密な名前が必要です。

于 2012-06-22T10:58:11.887 に答える