在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
Invalid memory address passed when calling custom DLL function in Microsoft Access SQL
>我想调用一个自定义函数Simil(LPCWSTR a, LPCWSTR b)
,用于计算Microsoft Access SQL (2019(中的Ratcliff/Obershelp字符串匹配算法。该函数驻留在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
。据我所知,第二个参数也指向垃圾,但至少它是一个有效的地址。
我找到了解决方法。我在 VBA 中使用了一个用户定义函数 (UDF(,我可以从 SQL 上下文中调用它。此函数需要驻留在模块中才能在 SQL 中使用。
Function fnSimilWrapper(a, b)
fnSimilWrapper = fnSimil(a, b)
End Function
如果执行 32 位构建,则还要创建函数 WINAPI (__stdcall(:
extern "C" double WINAPI Simil(LPCWSTR A, LPCWSTR B) { ... }
相关文章:
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 获取进程内存信息失败,错误 6 句柄无效
- 其他线程堆栈上的可用内存无效
- 不同类的虚拟函数共享相同的(无效?)内存地址
- 调用 GetPointerFrameTouchInfo时出现错误 998(对内存位置的无效访问)
- VerQueryValueA 在资源块之外写入无效内存
- Realloc():即使使用malloc()分配内存,旧大小也无效
- JNA 参数问题:内存访问无效
- Valgrind 未显示使用不正确的 c_str() 的无效内存访问
- JNA无效的内存访问
- 发生 JNI 调用 c++ dll "不满意链接错误: 对内存位置的无效访问"
- 只要我不使用它,我是否可以安全地创建对可能无效内存的引用?
- 为什么在realloc之后字符串在内存中变得无效
- 我的代码中真的有无效的内存访问吗
- 释放内存失败:free():下一个大小无效(快速):
- Python ctypes:如何释放内存?获取无效指针错误
- 获取错误代码 998 尝试从命名管道读取时对内存位置的访问无效
- 赋值运算符重载和无效内存
- 内存错误: free(): 下一个大小无效 (快速)
- 使用dll中的类时,内存无效