Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从C++;使用CoCreateInstance_C++_Vb.net_Dll_Com - Fatal编程技术网

C++ 从C++;使用CoCreateInstance

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

从我上一个问题开始,在某种程度上,我已经完成了以下项目的编译。它是基于

但是在运行时,对CoCreateInstance的调用失败。HRESULT是0x80131522-谷歌,大多数点击似乎与我没有使用的SQL server有关

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;
}
#包括
#包括
#导入“.\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参数不需要强命名

对不起。它真的回答了这个问题吗?