問題描述:
軟體同時整合兩種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()
; getcurrentdirectory(max_path, chcurdir); // 獲取當前程式所在的目錄
setcurrentdirectory(_t("..\\debug\\dh")); // 設定此目錄為搜尋起始目錄
hmodule hmod_dh = loadlibrary(_t("thdhipcsdk.dll")); // 動態載入dll庫
if (null == hmod_dh)
else
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)
pdhobj = pctor(); // 呼叫createobj函式
initdhsdk pinitdh = (initdhsdk)getprocaddress(hmod_dh, "initdhsdk"); // 獲取函式的位址指標
if (pinitdh == null)
else
initobj pinitobj = (initobj)getprocaddress(hmod_dh, "initobj"); // 獲取函式的位址指標
if (pinitobj == null)
else
; // 相當於取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)
else
; // 相當於取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;
}
三步快速解決dll衝突問題
最近在推廣應用我們的分布式服務閘道器 web api 業務組大部分對外的業務邏輯以hsf服務或者自定義擴充套件外掛程式的方式,註冊並發布到分布式服務閘道器中,統一對外提供webapi服務。臨時介紹下我們的分布式服務閘道器 1.一鍵註冊 發布webapi服務,2.統一管理發布webapi服務,實現we...
linux 下同名符號衝突問題解決方法
最近的工作中遇到如下令人蛋疼的問題 linux 下有三個模組aa bb cc,基本情況如下 cc 編譯連線得到 cc.so 動態庫,cc 中有如下介面 cc fun bb 編譯連線得到 bb.a 靜態庫,bb 中有如下介面 bb fun aa 編譯後通過 lbb 鏈結選項的方式連線 bb.a 得到 ...
linux 下同名符號衝突問題解決方案
linux 下同名符號程式設計客棧衝突問題解決方案 最近的工作中遇到如下令人蛋疼的問題 linux 下有三個模組aa bb ccuihxn,基本情況如下 cc 編譯連線得到 cc.so 動態庫,cc 中有如下介面 cc fun bb 編譯連線得到 bb.a 靜態庫,bb 中有如下介面 bb fun ...