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