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

8 篇文章 1 订阅
7 篇文章 0 订阅

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

图解:

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值