今天项目需要进行同一个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);

图解:

动态加载dll的问题(同一个进程使用dll的解决办法)_动态加载dll的问题