从动态加载的 dll 内部调用C++函数
Call C++ function from inside dynamically loaded dll
我正在编写一个C++程序,该程序在运行时动态加载dll并在该dll中调用函数。 这工作正常,但现在我想从 dll 中调用我的 C++ 程序中定义的函数。
我的主.cpp看起来像这样:
#include <Windows.h>
#include <iostream>
typedef void(*callC)(int);
int main()
{
HINSTANCE dllHandle = LoadLibrary("D:Librarieslib.dll");
callC func = (callC)GetProcAddress(dllHandle, "callC");
func(42);
FreeLibrary(dllHandle);
}
// I want to call this function from my dll
void callableFromDll(){
}
访问的 dll 部分是 C 中的 writtin,如下所示:
#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: %dn", 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)
返回父级的可执行句柄。
加载库加载 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"
告诉编译器不要将函数的名称编码为唯一名称。编译器对名称进行编码,以便链接器可以分隔公共函数或变量名称。
C"和外部"C++"函数声明、使用 __declspec(dllexport( 从 DLL 导出和使用 __declspec(dllimport( 导入函数调用。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用