解决同名dll冲突的问题

问题描述:

软件同时集成两种IPC的SDK时,遇到dll同名的情况,因此在调用时会出现冲突的情况。

解决方法如下:

采用动态加载dll库的方法。

#include "common.h"
#include "iostream"
#include "tchar.h"
#include "windows.h"
using namespace std;
using namespace cv;

#ifdef _DEBUG
#pragma comment(lib,"opencv_world320d.lib")
#else
#pragma comment(lib,"opencv_world320.lib")
#endif

// 声明所需使用的函数
typedef CTLEduCameraDH * (*PCTOR)();
typedef void (*INITDHSDK)(void*);
typedef void(*RELESDHSDK)();
typedef BOOL (WINAPI *INITOBJ)(TLEduDHCameraParam*);  // WINAPI翻译为汇编即为长调用
typedef BOOL(*START)();

int main()
{
	/************ IPC sdk 动态库设置:START *****************/
	TCHAR chCurDir[MAX_PATH] = { 0 };
	GetCurrentDirectory(MAX_PATH, chCurDir);   // 获取当前程序所在的目录
	SetCurrentDirectory(_T("..\\Debug\\dh"));  // 设置此目录为搜索起始目录

	HMODULE hMod_dh = LoadLibrary(_T("THdhIPCSDK.dll"));  // 动态加载dll库
	if (NULL == hMod_dh)
	{
		cout << "E: LoadLibray ipc SDK.DLL Failed!" << endl;
		FreeLibrary(hMod_dh);  
		getchar();
		return 1;
	}
	else
	{
		cout << "I: LoadLibray DH ipc SDK.DLL Success!" << endl;
	}

	SetCurrentDirectory(chCurDir);  // 还原搜索目录

	/************ IPC sdk 动态库设置:END *****************/

	TLEduDHCameraParam *param_T = (TLEduDHCameraParam *)malloc(sizeof(TLEduDHCameraParam));
	CCameraReciver *recv_T = new CCameraReciver;

	param_T->m_work_mod = 1; 
	param_T->m_in_video_height = 1080 * 2;
	param_T->m_in_video_width = 1920 * 2;
	param_T->g_lRealPort = 0;

	param_T->m_in_audio_channels = 2;
	param_T->m_in_audio_fmt = 0;
	param_T->m_in_audio_sample_rate = 16000;
	param_T->m_in_audio_type = 0;

	param_T->m_in_decode_type = 1;  // 1为软解;2为硬解
	recv_T->m_type = 1;
	param_T->m_pReciver = recv_T;

	strcpy(param_T->s_ipc_IP, "192.168.2.243");  // IP地址
	strcpy(param_T->s_ipc_UserName, "admin");   // 用户名
	strcpy(param_T->s_ipc_Password, "th12345678");   // 密码

	
	/********* IPC: START **********/
	CTLEduCameraDH * pDHObj;
	PCTOR pCtor = (PCTOR)GetProcAddress(hMod_dh, "CreateObj");  // 获取函数的地址指针
	if (pCtor == NULL)
	{
		cout << "E: Function CTest() not found.\n";
	}

	pDHObj = pCtor();  // 调用CreateObj函数

	INITDHSDK pInitDH = (INITDHSDK)GetProcAddress(hMod_dh, "InitDHSDK"); // 获取函数的地址指针
	if (pInitDH == NULL)
	{
		cout << "E: pInitDH not found.\n";
	}
	else
	{
		pInitDH(NULL);  // 调用InitDHSDK函数
	}

	INITOBJ pInitObj = (INITOBJ)GetProcAddress(hMod_dh, "InitObj"); // 获取函数的地址指针
	if (pInitObj == NULL)
	{
		cout << "E: pInitObj not found." << endl;
	}
	else
	{
		//__asm { MOV ECX, pDHObj};     // 相当于取this指针送到ECX寄存器中
		int flag = pInitObj(param_T);   // 调用InitObj函数
		if(flag)
			cout << "I: InitObj Success." << endl;
	}

	START pSTART = (START)GetProcAddress(hMod_dh, "Start");
	if (pSTART == NULL)
	{
		cout << "E: pSTART not found.\n";
	}
	else
	{
		//__asm { MOV ECX, pDHObj};				// 相当于取this指针送到ECX寄存器中
		int flag_T = (pSTART)();
		if (TRUE == flag_T)
			cout << "I: Techer IPC Start Success " << endl;
		else
			cout << "E: Techer IPC Start Fail " << endl;
}
	/********* IPC: END **********/

	getchar();
	RELESDHSDK pRelesObj = (RELESDHSDK)GetProcAddress(hMod_dh, "ReleaseDHSDK");  
	pRelesObj();    // 释放资源
	if(hMod_dh)
		FreeLibrary(hMod_dh); //释放库句柄
	if(hMod_mr)
		FreeLibrary(hMod_mr); //释放库句柄

	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lifei092

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值