簡體   English   中英

從C調用VB6中制作的DLL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM