从动态加载的 dll 中调用 C++ 函数
Call C++ function from inside dynamically loaded dll
我正在编写一个 C++ 程序,它在运行时动态加载一个 dll 并调用该 dll 中的一个函数。
这工作正常,但现在我想从 dll 中调用在我的 C++ 程序中定义的函数。
我的 main.cpp 看起来像这样:
#include <Windows.h>
#include <iostream>
typedef void(*callC)(int);
int main()
{
HINSTANCE dllHandle = LoadLibrary("D:\Libraries\lib.dll");
callC func = (callC)GetProcAddress(dllHandle, "callC");
func(42);
FreeLibrary(dllHandle);
}
// I want to call this function from my dll
void callableFromDll(){
}
访问的dll部分是用C写的,如下所示:
#include <stdio.h>
void callC(int);
void callC(int i){
print(i);
// Call the C++ function
//callableFromDll();
}
我已经阅读了有关 __declspec(dllimport)
和 __declspec(dllexport)
属性的信息,但我对 C++ 还是个新手,不确定这些是否正确,如果正确,如何使用它们。
在你的 C++ 程序中:
extern "C" _declspec(dllexport) void callableFromDll(int value) {
printf("This function was called from the main process. Value: %d\n", value);
}
在您的 DLL 中:
typedef void(*callableFromDll)(int);
callableFromDll func;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
func = (callableFromDll)GetProcAddress(GetModuleHandle(NULL), "callableFromDll");
func(69);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
GetModuleHandle(NULL)
Returns 父级的可执行句柄。
LoadLibrary 加载 DLL 时 exe 的控制台输出:
This function was called from the main process. Value: 69
cppfunction.exe (process 16336) exited with code 0.
Press any key to close this window . . .
extern "C"
告诉编译器不要将函数的名称编码为唯一名称。编译器对名称进行编码,以便链接器可以分隔常用函数或变量名称。
参见 extern "C" and extern "C++" function declarations, Exporting from a DLL Using __declspec(dllexport) and Importing function calls using __declspec(dllimport)。
我正在编写一个 C++ 程序,它在运行时动态加载一个 dll 并调用该 dll 中的一个函数。 这工作正常,但现在我想从 dll 中调用在我的 C++ 程序中定义的函数。
我的 main.cpp 看起来像这样:
#include <Windows.h>
#include <iostream>
typedef void(*callC)(int);
int main()
{
HINSTANCE dllHandle = LoadLibrary("D:\Libraries\lib.dll");
callC func = (callC)GetProcAddress(dllHandle, "callC");
func(42);
FreeLibrary(dllHandle);
}
// I want to call this function from my dll
void callableFromDll(){
}
访问的dll部分是用C写的,如下所示:
#include <stdio.h>
void callC(int);
void callC(int i){
print(i);
// Call the C++ function
//callableFromDll();
}
我已经阅读了有关 __declspec(dllimport)
和 __declspec(dllexport)
属性的信息,但我对 C++ 还是个新手,不确定这些是否正确,如果正确,如何使用它们。
在你的 C++ 程序中:
extern "C" _declspec(dllexport) void callableFromDll(int value) {
printf("This function was called from the main process. Value: %d\n", value);
}
在您的 DLL 中:
typedef void(*callableFromDll)(int);
callableFromDll func;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
func = (callableFromDll)GetProcAddress(GetModuleHandle(NULL), "callableFromDll");
func(69);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
GetModuleHandle(NULL)
Returns 父级的可执行句柄。
LoadLibrary 加载 DLL 时 exe 的控制台输出:
This function was called from the main process. Value: 69
cppfunction.exe (process 16336) exited with code 0.
Press any key to close this window . . .
extern "C"
告诉编译器不要将函数的名称编码为唯一名称。编译器对名称进行编码,以便链接器可以分隔常用函数或变量名称。
参见 extern "C" and extern "C++" function declarations, Exporting from a DLL Using __declspec(dllexport) and Importing function calls using __declspec(dllimport)。