Я сделал 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, «сообщение» функции фильтра формы установлено в порядке (!!!)