C++ 从C++;使用CoCreateInstance
从我上一个问题开始,在某种程度上,我已经完成了以下项目的编译。它是基于 但是在运行时,对CoCreateInstance的调用失败。HRESULT是0x80131522-谷歌,大多数点击似乎与我没有使用的SQL server有关 C++代码,非托管C++ 从C++;使用CoCreateInstance,c++,vb.net,dll,com,C++,Vb.net,Dll,Com,从我上一个问题开始,在某种程度上,我已经完成了以下项目的编译。它是基于 但是在运行时,对CoCreateInstance的调用失败。HRESULT是0x80131522-谷歌,大多数点击似乎与我没有使用的SQL server有关 C++代码,非托管 #include <iostream> #include <atlbase.h> #import "..\ClassLibrary1\bin\debug\ClassLibrary1.tlb" no_namespace usi
#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;
}
#包括
#包括
#导入“.\ClassLibrary1\bin\debug\ClassLibrary1.tlb”无\u名称空间
使用名称空间std;
int _tmain(int argc,_TCHAR*argv[]
{
ATLsure_成功(协同初始化(NULL));
CLSID-CLSID;
_ComClass1*t;
ATLsure_成功(::协同初始化(NULL));
ATLsure_成功(CLSIDFromProgID(OLESTR(“ClassLibrary1.comclas1”),&clsid));
HRESULT hr=CoCreateInstance(clsid,NULL,CLSCTX\u在PROC\u服务器中,
__uuidof(_ComClass1),(LPVOID*)和t;
ATLU成功(hr);
ATLsure_成功(t->showform());
ATLsure_成功(t->increment());
coninitialize();
返回0;
}
这是一个很好的DLL代码——在VB中几乎完全自动生成为COM DLL类。(DLL也显示为使用oleview注册)
_
公共类通信类1
#区域“COM GUID”
'这些GUID提供此类的COM标识
'及其COM接口。如果您更改它们,则现有
'客户端将无法再访问该类。
Public Const ClassId为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”
#末端区域
'可创建的COM类必须有一个Public Sub New()
'如果没有参数,则该类将不会
'已在COM注册表中注册,无法创建
'通过CreateObject。
公共分新()
MyBase.New()
端接头
私人f1表格1
公共子节目表()
f1=新表格1()
f1.Show()
端接头
公共分增额()
f1.进度条1.增量(5)
端接头
末级
这是一个类型加载异常
,HRESULT 0x80131522是COR\u E\u类型加载
这意味着CLR找不到您的程序集。它需要复制到与可执行文件相同的目录、路径中,或者在GAC中注册
REGASM
的文档说明:
使用Regasm.exe注册程序集后,可以将其安装在全局程序集缓存中,以便可以从任何COM客户端激活该程序集。如果程序集仅由单个应用程序激活,则可以将其放置在该应用程序的目录中
也就是说,除非它安装在客户机的应用程序目录中,安装在路径中,使用
/codebase
参数注册,或者安装在GAC中,后两者都需要一个强名称。FWIW,使用/codebase参数不需要强命名 对不起。它真的回答了这个问题吗?