[英]calling a DLL made in VB6 from C
好的,這是我遇到的最后一個問題的反面……我覺得我已經快要解決了,但它沒有用。 以前,我試圖用C編譯DLL,然后從VB調用它,但我意識到這並不是我想要的(我希望程序使用C編寫,同時使用VB前端,而不是前端是程序並使用DLL的功能)。
所以現在,我正在VB中編譯一個DLL,並嘗試從C .exe調用它。
“但是等等,您不能使用VB編譯DLL!” 實際上 ,我攔截了對鏈接器的VB6.EXE調用,並為我要導出的功能添加了一個定義文件,這是最好的部分-如果將dll復制到system32,則可以從另一個VB程序調用這些功能而且效果很好。 唯一的事情是,我似乎無法從C加載它。好了,我可以了,我得到了句柄,我得到了函數的地址,只是程序失敗了。
這是我導出的虛擬函數:
Public Function PopupMessage(ByVal rawr As Integer) As Integer
Msgbox "HERE BE " & rawr & " DRAGON(S)."
PopupMessage = 4
End Function
我可以從另一個VB6程序中這樣稱呼它:
Public Declare Function PopupMessage Lib "vbdll" _
(ByVal howmanydragons As Integer) As Integer
Private Sub Command1_Click()
If IsNumeric(Text1.Text) Then
Text2.Text = PopupMessage(Text1.Text)
End If
End Sub
並且,從C:
int main(){
typedef short int (*vbfun)(short int); //VB6 "Integer" is 16 bits
vbfun popup_message;
HANDLE dllhnd;
dllhnd = LoadLibrary("vbdll.dll");
if(dllhnd>(void*)HINSTANCE_ERROR){
popup_message = (vbfun)GetProcAddress(dllhnd, "PopupMessage");
printf("%d", popup_message(3));
}
return 0;
}
當我調試時,我發現我遇到了訪問沖突,這過去意味着我在VB函數中忘記了ByVal,並且它傳遞了對5的引用。 但是我在這里看不到任何錯誤...我從DLL中獲得了ProcAddress,它與我從dumpbin中獲得的偏移量匹配,我可以從VB中調用它,但是C調用者遇到訪問沖突...
有任何想法嗎? 有人看到我忽略了的東西嗎? 我意識到我正在做一些相當模糊的事情,而且幾乎是聞所未聞的,而不是僅僅學習如何在C語言中設計前端,但是現在我決心修復它。
只需使用免費的插件vbAdvance即可 。 它使您可以創建可從C調用的標准DLL(而不是COM DLL)。
它還使您可以訪問許多其他高級構建功能和許多IDE便利功能。 創建控制台應用程序,在DLL中創建DllMain入口點,用於XP樣式的XP Manifest編譯器,支持終端服務器等。
(沒有冒犯,但您是在這里重塑方向,而不是開拓新天地!我在此答案上也鏈接到vbAdvance。)
您必須先在導出的函數中手動初始化VB6運行時,然后才能在運行時中使用任何功能。 查看緊湊型進程內多線程示例, ThreadEntry
函數顯示了如何執行此操作。
您將必須通過COM接口調用它,不是嗎? 更像這樣 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.