使用C++;动态链接库 我正在创建我自己的C++ DLL。我希望能够从C++的DLL中使用我的COM库。 以下是我如何使用普通exe中的COM DLL: #import "MyLib.tlb" using namespace MyLib;

使用C++;动态链接库 我正在创建我自己的C++ DLL。我希望能够从C++的DLL中使用我的COM库。 以下是我如何使用普通exe中的COM DLL: #import "MyLib.tlb" using namespace MyLib; ,c++,windows,dll,com,dllimport,C++,Windows,Dll,Com,Dllimport,使用C++;动态链接库 我正在创建我自己的C++ DLL。我希望能够从C++的DLL中使用我的COM库。 以下是我如何使用普通exe中的COM DLL: #import "MyLib.tlb" using namespace MyLib; int main(int argc, char* argv[]) { CoInitialize(NULL); ITestClassPtr testClass(__uuidof(TestClass)); long res

使用C++;动态链接库 <>我正在创建我自己的C++ DLL。我希望能够从C++的DLL中使用我的COM库。 以下是我如何使用普通exe中的COM DLL:

#import "MyLib.tlb"
using namespace MyLib;

int main(int argc, char* argv[])
{
    CoInitialize(NULL);
    ITestClassPtr testClass(__uuidof(TestClass));
    long result = testClass->Add(20, 34);
    std::cout << result;
    std::cout << "\n" << std::endl;
    system("pause");
    CoUninitialize();

    return EXIT_SUCCESS;
}

COM
对象是使用
CoCreateInstance
(或
CreateInstance
COM
智能指针上创建的。通常不会
new
将其更新。相关:仅为您提供信息,该
main()
示例“工作不太好”。该代码在释放智能指针之前会撕裂COM(调用对象的
Release()
,等等)。如果该对象使用COM初始化的所需API执行任何操作(例如:
SysAllocString
,等等),并在发布时清除它们(例如:
SysFreeString()
,它将在
main()
结束之前崩溃。您可以在DllMain()中执行的操作)entrypoint受到非常严格的限制。Windows加载程序使用锁来确保entrypoint调用被严格序列化,这就是臭名昭著的“加载程序锁”。这意味着您无法加载任何其他DLL。因此,在DllMain()中,CoInitializeEx()和CoCreateInstance()都是非法的。您将需要导出一个函数。@WhozCraig如何修复它?我在internet上找不到太多信息。这是第一件工作正常的事情。@HansPassant您能告诉我怎么做吗?我应该创建两个函数DLLInitialize和dllunitialize,它们应该由hosing应用程序调用吗?在这些函数中放入什么?代码s尼佩特将非常感激。我一直在寻找答案,但什么也没找到
#import "MyLib.tlb"
using namespace MyLib;
ITestClassPtr testClass;

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        CoInitialize(NULL);
        testClass = new ITestClassPtr(__uuidof(TestClass));
        break;
    case DLL_PROCESS_DETACH:
        CoUninitialize();
        break;
    case DLL_THREAD_ATTACH:
        CoInitialize(NULL);
        break;

    case DLL_THREAD_DETACH:
        CoUninitialize();
        break;
    default:
        break;
    }

    return TRUE;
}