问题描述
自从我上一个问题以来,我进行了一些进展,我已经得到了以下项目来编译。它基于
In some measure of progress since my last question I have got the following project to compile. It is based on https://stackoverflow.com/a/10949784/846550
但是在运行时,对CoCreateInstance的调用失败。 HRESULT是0x80131522 - google为这个,大多数命中似乎与我没有使用的SQL服务器相关。
However at runtime the call to CoCreateInstance fails. The HRESULT is 0x80131522 - google for this and most hits seem to relate to SQL server which I am not using.
C ++代码,非管理
C++ code, unmanaged
#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代码 - 几乎完全自动生成为一个COM DLL在VB中的类。 (该DLL显示为使用oleview注册)。
Here is the DLL code for good measure - almost completely autogenerated as a COM DLL class in VB. (The DLL shows up as registered using oleview as well).
<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
推荐答案
这是一个 TypeLoadException
,HRESULT 0x80131522是 COR_E_TYPELOAD
。
This is a TypeLoadException
, HRESULT 0x80131522 is COR_E_TYPELOAD
.
这意味着CLR无法找到您的程序集。它需要复制到与可执行文件相同的目录中,在路径中或在GAC中注册。
What it means is that the CLR could not find your assembly. It needs to be either copied into the same directory as the executable, in the path, or registered in the GAC.
REGASM
说:
- http://msdn.microsoft.com/en-us/library/tzat5yw6(v=vs.71).aspx
除非安装在客户端的应用程序目录中,路径中已注册到 / codebase
参数,或者在GAC中,后者将不会创建它两个都需要一个强名称。
I.e. it won't be creatable unless it is either installed in the application directory of the client, in the path, registered with the /codebase
argument, or in the GAC, the latter two which both require a strong name.
这篇关于使用CoCreateInstance从C ++调用COMVisible VB.Net dll的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!