以前建的專案都是在WIN32專案里直接選擇DLL,這種DLL加載起來也都沒有問題
近期需要做一個能加載OCX控制元件的DLL,由此我選擇了MFC里的MFC DLL專案,新建完后,就在對話框下添加了ActiveX控制元件,以及為這個控制元件添加了變數,其他關于介面的設定,例如.def檔案以及介面OpenDevice也都實作了,其他沒動,編譯生成了840D.dll,用DLL查看工具也能看到介面了
在同專案下的test控制臺程式 LoadLibrary的時候有回傳值,但是例外,test程式如下
typedef int(*lpopen)(int);
int main()
{
HINSTANCE hDll;
lpopen func;
//根據以往加載DLL經驗,此回傳值應該是有問題的
hDll = LoadLibrary(".\\840D.dll");//hDll回傳值為 840D.dll !0x0f7d0000(符號檔案中缺少型別資訊){unused = 0x00905a4d}
int err = GetLastError(); //回傳值為0
func = (lpopen)GetProcAddress(hDll, "open_device"); //有回傳值,但是除錯的時候進不去介面函式
err = GetLastError(); //回傳值為0
return 0;
}
為了測驗,我在介面里添加了printf做測驗,并無輸出,說明介面并沒有呼叫成功
int open_device(/*const char *json, HDEVICE *phDevice*/int x)
{
printf("test");
Driver *driver = new Driver;
driver->OpenLink();
return 0;
}
uj5u.com熱心網友回復:
說明你介面的實作里有問題?自己再dll中加些log資訊看看哪個函式呼叫失敗了?uj5u.com熱心網友回復:
那LoadLibrary的時候回傳值是840D.dll !0x0f7d0000(符號檔案中缺少型別資訊){unused = 0x00905a4d}
這個并沒有問題嗎,我一直懷疑是Load的時候就失敗了
uj5u.com熱心網友回復:
只要LoadLibrary如果失敗的話,回傳值是NULL,你就檢查一下是否為NULL即可。
uj5u.com熱心網友回復:
所有變數最好初始化下。loadlibrary失敗則hDll應該是NULL,回傳0估計是正常的。
GetProcAddress失敗則func為NULL。
如果你就用的上述代碼的話,那么告訴你錯誤在哪兒,你只獲得了函式的指標,而沒呼叫該函式,沒輸出才是正常的,有輸出就有鬼了。應該在
func = (lpopen)GetProcAddress(hDll, "open_device"); //有回傳值,但是除錯的時候進不去介面函式
err = GetLastError(); //回傳值為0
((lpopen)fun)(0);
另外看你
int open_device(/*const char *json, HDEVICE *phDevice*/int x)
{
printf("test");
Driver *driver = new Driver;
driver->OpenLink();
return 0;
}
這段代碼我也覺得有問題,你這個driver是自己封裝的對話框類?
uj5u.com熱心網友回復:
LoadLibrary( _T("C:\\840D.dll") ); //使用全路徑試試看還有就是每一步錯誤回傳不同的值 這樣便于定位問題點
uj5u.com熱心網友回復:
所有變數最好初始化下。
loadlibrary失敗則hDll應該是NULL,回傳0估計是正常的。
GetProcAddress失敗則func為NULL。
如果你就用的上述代碼的話,那么告訴你錯誤在哪兒,你只獲得了函式的指標,而沒呼叫該函式,沒輸出才是正常的,有輸出就有鬼了。應該在
func = (lpopen)GetProcAddress(hDll, "open_device"); //有回傳值,但是除錯的時候進不去介面函式
err = GetLastError(); //回傳值為0
((lpopen)fun)(0);
另外看你
int open_device(/*const char *json, HDEVICE *phDevice*/int x)
{
printf("test");
Driver *driver = new Driver;
driver->OpenLink();
return 0;
}
這段代碼我也覺得有問題,你這個driver是自己封裝的對話框類?
所有變數最好初始化下。
loadlibrary失敗則hDll應該是NULL,回傳0估計是正常的。
GetProcAddress失敗則func為NULL。
如果你就用的上述代碼的話,那么告訴你錯誤在哪兒,你只獲得了函式的指標,而沒呼叫該函式,沒輸出才是正常的,有輸出就有鬼了。應該在
func = (lpopen)GetProcAddress(hDll, "open_device"); //有回傳值,但是除錯的時候進不去介面函式
err = GetLastError(); //回傳值為0
((lpopen)fun)(0);
另外看你
int open_device(/*const char *json, HDEVICE *phDevice*/int x)
{
printf("test");
Driver *driver = new Driver;
driver->OpenLink();
return 0;
}
這段代碼我也覺得有問題,你這個driver是自己封裝的對話框類?
不是的,這是我的驅動操作類。
介面函式果然是你說的那個問題,但是奇怪,我以前建的WIN32下專案里面的DLL,呼叫的時候,只要
func = (lpopen)GetProcAddress(hDll, "open_device");就可以了
為什么 MFC DLL工程里還需要((lpopen)fun)(0);這句話,不解
uj5u.com熱心網友回復:
所有變數最好初始化下。
loadlibrary失敗則hDll應該是NULL,回傳0估計是正常的。
GetProcAddress失敗則func為NULL。
如果你就用的上述代碼的話,那么告訴你錯誤在哪兒,你只獲得了函式的指標,而沒呼叫該函式,沒輸出才是正常的,有輸出就有鬼了。應該在
func = (lpopen)GetProcAddress(hDll, "open_device"); //有回傳值,但是除錯的時候進不去介面函式
err = GetLastError(); //回傳值為0
((lpopen)fun)(0);
另外看你
int open_device(/*const char *json, HDEVICE *phDevice*/int x)
{
printf("test");
Driver *driver = new Driver;
driver->OpenLink();
return 0;
}
這段代碼我也覺得有問題,你這個driver是自己封裝的對話框類?
所有變數最好初始化下。
loadlibrary失敗則hDll應該是NULL,回傳0估計是正常的。
GetProcAddress失敗則func為NULL。
如果你就用的上述代碼的話,那么告訴你錯誤在哪兒,你只獲得了函式的指標,而沒呼叫該函式,沒輸出才是正常的,有輸出就有鬼了。應該在
func = (lpopen)GetProcAddress(hDll, "open_device"); //有回傳值,但是除錯的時候進不去介面函式
err = GetLastError(); //回傳值為0
((lpopen)fun)(0);
另外看你
int open_device(/*const char *json, HDEVICE *phDevice*/int x)
{
printf("test");
Driver *driver = new Driver;
driver->OpenLink();
return 0;
}
這段代碼我也覺得有問題,你這個driver是自己封裝的對話框類?
不是的,這是我的驅動操作類。
介面函式果然是你說的那個問題,但是奇怪,我以前建的WIN32下專案里面的DLL,呼叫的時候,只要
func = (lpopen)GetProcAddress(hDll, "open_device");就可以了
為什么 MFC DLL工程里還需要((lpopen)fun)(0);這句話,不解
唉,我傻了,原來忘了這句話,抱歉
另想咨詢下你,我這種新建 MFC-DLL的工程,然后在對話框里面加載OCX控制元件,但是并不去實作對話框,只是作為容器得到OCX控制元件里的介面函式,然后在我封裝的Drive驅動操作類里呼叫,這種方法可行嗎?
uj5u.com熱心網友回復:
可行,driver最好是容器對話框,表單一定要初始化出來,隱藏掉即可。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/129736.html
上一篇:SDI專案中多載OnFileOpen函式打開檔案失敗,求解答
下一篇:VC或QT怎么能直接列印檔案?
