c++ - 初始化 COM 对象的问题

标签 c++ windows vb.net com com-interop

我编译了以下 VB 代码并得到了 dll ("TestVB.dll") 和 tlb ("TestVB.tlb") 文件作为输出。

Imports System
Imports System.Runtime.InteropServices

Namespace TesterNS

    <ComVisible(True),
    Guid("4B673F5A-A953-4C20-9A90-8F94ED2F6DDF"),
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)>
    Public Interface _Tester
        Function GetMonth() As Integer
    End Interface

    <ComVisible(True),
    Guid("FEC833EE-37E9-4406-9344-8A8BD5C43B07"),
    ClassInterface(ClassInterfaceType.None),
    ProgId("Tester.Numbers1")> Public Class Tester
        Implements _Tester

        Public Tester()

        Public Function GetMonth() As Integer Implements _Tester.GetMonth
            GetMonth = DateTime.Now.Month
        End Function
    End Class

End Namespace

我选择了

Register for COM interop

VB 项目的项目设置中的选项。

我正在尝试从 C++ 代码访问上述功能。 我在 C++ 的 stdafx.h 文件中包含了以下导入语句。

#import "TestVB.tlb" no_function_mapping, no_namespace, named_guids

并尝试按如下方式访问 COM 对象:

HRESULT hr = CoInitialize(NULL);
_TesterPtr t1 = NULL;
CLSID cls;
std::string s = "";
bool flag = false;
hr = CLSIDFromProgID(L"Tester.Numbers1", &cls);
if (SUCCEEDED(hr))
{
    hr = CoCreateInstance(cls, NULL, CLSCTX_INPROC_SERVER, __uuidof(_Tester), (void**)&t1);
    if (SUCCEEDED(hr))
        s = "success";
    else
        s = "fail";
}

在调用 CoCreateInstance 后,我看到 hr = REGDB_E_CLASSNOTREG Class not registered 错误。

我不确定我做错了什么。

最佳答案

在我的 C++ 应用程序中,在 CoInitialize(NULL) 之前调用了 AfxOleInit()。如果我删除对 CoInitialize(NULL) 的调用,我就能让它正常工作。

关于c++ - 初始化 COM 对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49581133/

相关文章:

c++ - 我如何制作一个允许所有左值引用、右值引用和 initializer_list 的模板化构造函数?

c++ - 模板 friend 类 : Forward Declaration or. ..?

c - 如何确定套接字是否已在 Windows 中处于非阻塞模式?

vb.net - 委托(delegate)和地址

c# - 如何检查 Google AdSense 在我的 ASP.NET 网站中是否正常工作?

关于加法运算符重载的 C++ 问题

c++ - 如何判断数字是否有从右到左升序排列的数字

java - 用 Java 编写的 Windows 桌面应用程序的 Windows 8 商店认证

windows - Flutter Desktop 使用鼠标滚轮滚动 : step size

Javascript 自动将 pdf 保存到某个位置?