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