今天项目需要进行同一个dll的多线程同时操作。
解决办法 :通过动态加载的办法 将dll复制重命名 即
线程A-----复制test.dll并重命名为test_A.dll--动态加载test_A.dll
线程B-----复制test.dll并重命名为test_B.dll--动态加载test_B.dll
//现在dll中的函数为
DWORD WINAPI SUP300_Open(_Out_ HANDLE* hHandle, _In_ int ControlType);
调用流程
//1.定义函数指针
typedef DWORD(_stdcall*SUP300_Open)(HANDLE*, int);
//2.声明函数指针变量
SUP300_Open nSUP300_Open;
//3.动态加载到内存 //SUP300API是动态库的名字
HINSTANCE hModule = LoadLibrary(_T("SUP300API"));
//4.获取函数地址
nSUP300_Open = (SUP300_Open)GetProcAddress(hModule, "SUP300_Open");
//5.调用函数
ret = nSUP300_Open(&pHandle, SUP300_CONTROL_DCL); //打开SUP设备
//6.释放动态链接库
FreeLibrary(hModule);
多个线程同步的解决办法
A线程中
//1.定义函数指针
typedef DWORD(_stdcall*SUP300_Open)(HANDLE*, int);
//2.声明函数指针变量
SUP300_Open nSUP300_Open;
***************************
//复制DLL文件
CopyFile(_T("./SUP300API.dll"), _T("SUP300API_A.dll"),FALSE);
//3.动态加载到内存 //SUP300API是动态库的名字
HINSTANCE hModule = LoadLibrary(_T("SUP300API_A"));
*********************
//4.获取函数地址
nSUP300_Open = (SUP300_Open)GetProcAddress(hModule, "SUP300_Open");
//5.调用函数
ret = nSUP300_Open(&pHandle, SUP300_CONTROL_DCL); //打开SUP设备
//6.释放动态链接库
FreeLibrary(hModule);
B线程中
//1.定义函数指针
typedef DWORD(_stdcall*SUP300_Open)(HANDLE*, int);
//2.声明函数指针变量
SUP300_Open nSUP300_Open;
***************************
//复制DLL文件
CopyFile(_T("./SUP300API.dll"), _T("SUP300API_B.dll"),FALSE);
//3.动态加载到内存 //SUP300API是动态库的名字
HINSTANCE hModule = LoadLibrary(_T("SUP300API_B"));
*********************
//4.获取函数地址
nSUP300_Open = (SUP300_Open)GetProcAddress(hModule, "SUP300_Open");
//5.调用函数
ret = nSUP300_Open(&pHandle, SUP300_CONTROL_DCL); //打开SUP设备
//6.释放动态链接库
FreeLibrary(hModule);
图解: