从 MS 访问调用 dll 函数

Posted

技术标签:

【中文标题】从 MS 访问调用 dll 函数【英文标题】:calling a dll function from MS access 【发布时间】:2014-02-02 18:42:48 【问题描述】:

您好,我正在尝试在 ms access vba 中调用此函数。它只是抛出了糟糕的调用约定。我试图重新编译访问但 zilch。我之前调用过 dll 函数,所以也许我错过了一些基本的东西,或者可能与 dll 文件有一些不兼容。提前感谢您的帮助。

我的 ms 访问代码

Private Declare Function StartComm Lib "C:\ComConcert.dll" ( _
    ByVal ulPort As Long, ByVal ulBaudRate As Long, ByVal ulByteSize As Long, _
    ByVal ulParity As Long, ByVal ulStopbits As Long, ByVal lncontrol As Long) _
    As Long

Dim OpnPort As Long
OpnPort = StartComm(3, 9600, 7, 0, 0, 0)

dll 文件的原始 c 代码。

DLLEXPORT unsigned long StartComm(unsigned long ulPort, unsigned long ulBaudRate, 
    unsigned long ulByteSize, unsigned long ulPartity, unsigned long ulStopBits,
    unsigned long ulFlowControl);

【问题讨论】:

显然 Longunsigned long 不是匹配类型。尝试仅使用 long 而不使用 unsigned @πάνταῥεῖ 这些类型匹配得很好。由于 VBA 没有无符号类型,因此您无法做得更好。我不认为DLL可以更改。所以参数类型是正确的。 【参考方案1】:

您的 DLL 中的函数未指定调用约定。因此假设它使用默认值__cdecl。这意味着它不能从 VBA 访问。您能够调用它的唯一方法是创建一个适配器 DLL,该 DLL 导出一个 __stdcall 函数供 VBA 调用。然后适配器 DLL 可以将调用转发给原始的 __cdecl 函数。

【讨论】:

以上是关于从 MS 访问调用 dll 函数的主要内容,如果未能解决你的问题,请参考以下文章

从 Delphi“访问冲突”正确调用 DLL 中的 C++ 函数

从Delphi调用C ++ DLL时发生访问冲突

如何使用 DetourAttachEx 创建蹦床功能? (与 MS 绕道而行)

从 64 位应用程序调用 32 位 DLL 的函数

Win32环境下从ntdll.dll调用Nt函数,C++

从 DLL 函数调用非 DLL 函数