在Microsoft Access SQL中调用自定义DLL函数时传递了无效的内存地址

问题描述 投票:0回答:2

我想调用自定义函数Simil(LPCWSTR a, LPCWSTR b)来计算Microsoft Access SQL(2019)中的Ratcliff/Obershelp string matching algorithm。该功能位于Simil.dll中。以下是dllmain.cpp文件,该文件定义了入口点,并使用Nuwen MinGW发行版进行了编译。

#ifdef __MINGW32__
#include <windows.h>
#endif

extern "C"
{
#include "simil.h"
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

extern "C" __declspec(dllexport) double Simil(LPCWSTR a, LPCWSTR b) {
    return simil((const wchar_t*)a, (const wchar_t*)b);
}

我按如下方式在VBA中加载DLL,并且它在VBA本身中也能很好地工作。

Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _
    (ByVal lpLibFileName As String) As Long

Private Sub Init()
    LoadLibrary(CurrentProject.Path & "/Simil.dll")
    Debug.Print fnSimil(StrConv("TestABC", vbUnicode), StrConv("TestACB", vbUnicode))  ' 0.85..
    Debug.Print fnSimil("TestABC", "TestACB")  ' 0.85..
End Sub

但是,在Microsoft Access SQL中调用该函数时,由于成功调用并运行该函数(直到访问第一个参数的指令),程序由于访问冲突而崩溃。

Public Declare PtrSafe Function fnSimil _
   Lib "Simil" Alias "Simil" _
   (ByVal strOne As String, ByVal strTwo As String) As Double

Private Sub Update() 
    Me![Results].RowSource = "SELECT name from db ORDER BY fnSimil([db.name], ""Test"") DESC"  ' crash!
End Sub

实际上,调试器告诉我,无论我如何更改上面的SQL查询,Simil的第一个参数似乎总是地址0x0000000000000005。据我所知,第二个参数也指向垃圾,但至少它是一个有效的地址。

我想调用自定义函数Simil(LPCWSTR a,LPCWSTR b)以计算Microsoft Access SQL(2019)中的Ratcliff / Obershelp字符串匹配算法。该函数驻留在Simil.dll中。 ...

c++ vba ms-access dll
2个回答
1
投票

我找到了解决方法。我在VBA中使用了用户定义函数(UDF),可以从SQL上下文中调用它。此功能需要驻留在模块中,才能在SQL中使用。


0
投票

如果执行32位构建,也要使函数WINAPI(__stdcall):

© www.soinside.com 2019 - 2024. All rights reserved.