我在使用vba Excel 64位(Win8)中的DLL函数时遇到问题。 当我强制从绝对DLL路径加载函数声明时,如下所示,没有问题,我的代码运行良好。
geoDataRequest
然而,我并不想要绝对的道路。所以,我把dll文件放在excel文件旁边(在同一文件夹中)并声明如下函数:
Private Declare PtrSafe Function get_Ith Lib "MYPATH\CVode.dll" (ByVal lpv As LongPtr, ByVal i As LongPtr) As Double
然后我在excel表的Workbook_Open中包含以下语句。
Private Declare PtrSafe Function get_Ith Lib "CVode.dll" (ByVal lpv As LongPtr, ByVal i As LongPtr) As Double
End Sub
我一直在使用这个方法来处理这个dll(但是更新的版本)以及其他没有任何问题的项目。 但是现在vba从dll函数中返回一些不相关的值,我的程序会爆炸。 顺便说一下,dll是用c ++编写的,我有源代码。在源代码中有.def文件将所有函数导出到外部程序 如果你帮助我,我将不胜感激
答案 0 :(得分:0)
我认为这不是造成问题的途径。你没有显式路径时加载错误的DLL,或者你作为64位DLL调用的DLL实际上是32位DLL。
请注意,因为Excel在通过使用错误的声明调用DLL来损坏堆栈之后执行stack-fixup,所以您不会总是看到您创建的错误。确保在DLL代码中声明的指针与在64位Excel中使用的指针大小相同。
答案 1 :(得分:0)
还要确保您的调用约定(stdcall等)在做正确的事情。您没有使用别名这一事实表明,至少应注意您的调用约定。 ByVal看起来不错。