我在Ms Access vba项目中制作了一个带有C的dll。该dll使用了vba回调函数。根据MS文档,vba回调函数必须在模块中,而不是在窗体的代码中。在回调函数中,我设置了表单的filter属性。但是正因为如此,Access在执行到达那里时崩溃了!!!为什么?对表单组件的其他引用没有问题(例如,当我设置表单文本框的值时) 谢谢
使用VS 2017编译的C dll代码:
#include <windows.h>
#include <stdlib.h>
#include <tchar.h>
typedef void(__stdcall * CallbackFunction)();
DWORD __stdcall ThreadFunc(CallbackFunction Callback) {
Callback();
return 0;
}
__declspec(dllexport) void __stdcall message(CallbackFunction Callback) {
// Array to store thread handles
HANDLE Array_Of_Thread_Handles[1];
Array_Of_Thread_Handles[0] = CreateThread(NULL, 0, ThreadFunc, Callback, 0, NULL);
}
这是从vba中调用dll函数“消息”的代码
Private Sub Form_Load()
Call message(AddressOf Callback)
End Sub
dll的vba声明
Public Declare Sub message Lib "MonitoringDirectoryDLL.dll" Alias "_message@4" (ByVal Callback As Long)
vba回调子例程(根据MS文档位于模块上)
Public Sub Callback()
On Error Resume Next
Forms("MyForm").txtTest="test" 'this line executed well and the string "test" appears ok in the form.
Forms("MyForm").Filter="" 'in this line Access crashes out
Forms("MyForm").FilterOn=True
End Sub
更新1
我发现仅当从Thread函数(ThreadFunc)调用vba Callback Sub时,问题才存在。如果是从dll中“消息”功能表单的过滤器中调用的,则设置为ok(!!!)