gpt4 book ai didi

c - 从 native C DLL 调用回调到 VB6

转载 作者:行者123 更新时间:2023-11-30 15:34:24 25 4
gpt4 key购买 nike

我正在尝试获取 native C 函数来调用 VB6 应用程序中的回调。在 VB 中,代码如下所示:

Private Declare Sub StartUp Lib "library.dll" (ByVal cbAddress As Long)

Public Sub MySub
Call StartUp(AddressOf MyCallback)
End Sub

Public Sub MyCallback(ByVal str As String)
' Use str in UI
End Sub

当我从 VB6 IDE 运行此程序时,一切正常:调用回调并且我可以毫无问题地使用 str 参数。但是,当我将 VB6 应用程序编译为 exe 时,调用回调时应用程序将崩溃。从我在谷歌搜索中可以看出,这似乎是某种线程问题。有些人建议使用 Win32 SendMessage 来以某种方式避免此线程问题。我不太清楚该怎么做。我会在回调中调用 SendMessage 吗?我如何在主线程上收到此消息?另外,我如何将字符串传递到 SendMessage 中?

编辑:我刚刚发现这个: Vb6 application works in the IDE but the executable crashes

但是,我最初的问题仍然存在。

Edit2:我也应该包含在 C 代码中。这是回调的定义和调用方式:

typedef void (__stdcall *FUNCPTR)(BSTR);
int wslen = MultiByteToWideChar(CP_ACP, 0, cstr, strlen(cstr), 0, 0);
BSTR bstr = SysAllocStringLen(0, wslen);
MultiByteToWideChar(CP_ACP, 0, cstr, strlen(cstr), bstr, wslen);
((FUNCPTR) _cbAddress)(bstr);
SysFreeString(bstr);

同样,从 IDE 调用时效果很好...

最佳答案

显然,理想的情况是确保回调始终发生在 VB 应用程序的主线程上。否则,您将被迫对应用程序中的窗口使用 SendMessage(),以利用 Window 自身在 Windows 之间的编码能力。

很久以前,我编写了一个 VB 应用程序,它从 DLL 中获取回调,该 DLL 用于与远程控制集成。但DLL使用另一个线程与硬件集成。在回调中,我使用 SendMessage()WM_COPYDATA 将数据编码到主 VB 线程,该线程由子类化代码拾取。

当然,由于您正在编写 C DLL 并且只是传回 ASCII 文本,因此您可以跳过几个阶段,而不必编写回调过程或子类化代码。只需使用 SetWindowText() 将文本直接写入 TextBox 即可。 API 调用。确保在始终加载的表单上使用 Visible = False 创建此 TextBox。然后你只需要使用这段代码:

BOOL WINAPI SetWindowText(
_In_ HWND hWnd,
_In_opt_ LPCTSTR lpString
);

HWND m_hWndTextBox

void StartUp(HWND hWndTextBox)
{
m_hWndTextBox = hWndTextBox;
// other stuff
}

void Callback(char *cstr) {
SetWindowText(m_hWndTextBox, cstr);
}

VB 代码:

' Form "Form1" with text box "Text1".

Private Declare Sub StartUp Lib "library.dll" (ByVal hWndTextBox As Long)

Public Sub MySub
Call StartUp(Text1.hWnd)
End Sub

Private Sub Text1_Change()
DoStuffWithDLLUpdateString Text1.Text
End Sub

您甚至不必将字符串转换为 BSTR - VB 会为您完成此操作。

关于c - 从 native C DLL 调用回调到 VB6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23301699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com