簡體   English   中英

在 VB6 中使用來自 C-Dll 的回調

[英]Using a callback from a C-Dll in VB6

我必須將用 C 編寫的 dll 的一些功能導入 VB6 項目。 我有一個用 C# 編寫的示例,但我真的不知道如何在 VB6 中做同樣的事情。

在 C# 中是這樣的:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int someCallback(IntPtr ch, uint chL, IntPtr cbData);

[DllImport("someDLL.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int someFunction(IntPtr con, someCallback callback, IntPtr cbData);

調用someFunction時,示例中的一切正常。

dll 的文檔只是給了我這個:

typedef int(SOMEAPI_CALL * someCallback)(const unsigned char *ch,
                                         unsigned int         chL,
                                         void                *cbData)

SOMEAPI_CALL someFunction(Con*         con,
                          someCallback callback,
                          void*        cbData)

在 VB6 中應該有一種方法可以做到這一點,但我對這種語言沒有太多經驗。 搜索了 web 一段時間,但沒有找到任何可以幫助我的東西。

我知道如何在我的項目中從 dll 聲明函數,但僅此而已。 如何將此UnmanagedFunctionPointer東西轉換為 VB6 代碼,我只是不知道。

VB6 沒有 VB.NET(和 C#)那樣的屬性,無論如何注釋都是不必要的。 您可以通過運算符將 function 指針傳遞給 C AddressOf ZC1C425268E68385D1AB5074

Declare Function someFunction Lib "someDLL" ( _
    ByVal con As Long, _
    ByVal callback As Long, _
    ByVal data As Long _
) As Long

…

Call someFunction(con, AddressOf SomeCallback, data)

但即使這樣也行不通,因為 VB6 不支持使用 cdecl 調用約定的本機互操作,它只支持 stdcall。 您將需要使用 stdcall 調用約定重新編譯您的 DLL,或者在 C 或 IDL 中創建一個包裝器(有一些黑客使用內聯匯編來包裝單個 cdecl 調用,但我不建議使用這些)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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