当它的回调函数从dll的线程函数调用时,Access崩溃

时间:2019-05-22 07:59:38

标签: dll callback access-vba

我在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(!!!)

0 个答案:

没有答案