Ms Access падает, когда его функция обратного вызова вызывается из функции потока DLL - PullRequest
0 голосов
/ 22 мая 2019

Я сделал dll с C для использования в проекте MS Access vba. DLL использует функцию обратного вызова vba. Согласно документации MS, функция обратного вызова vba должна быть в модуле, а не в коде формы. Внутри функции обратного вызова я установил свойство фильтра формы. Но из-за этого Access аварийно завершает работу, когда исполняется там !!! Зачем? Другие ссылки на компоненты формы не имеют проблем (например, когда я устанавливаю значение текстового поля формы) Спасибо

Код C dll, скомпилированный с VS 2017:

#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);
}

А вот код, который вызывает функцию dll "message" из vba

Private Sub Form_Load()
    Call message(AddressOf Callback)
End Sub

VBA Декларация dll

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

Я обнаружил, что проблема существует только при вызове vba Callback Sub из функции Thread (ThreadFunc). Если он вызывается изнутри dll, «сообщение» функции фильтра формы установлено в порядке (!!!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...