调用C++;来自VBA的DLL,获取;访问冲突写入位置“;错误 我有一个Excel VBA项目,我试图从VisualStudio 2013输出的C++ DLL调用函数。我已经添加了对DLL的引用。当我尝试在VS调试器中运行它时,它连接到Excel实例,在该实例中我使用以下方法调用DLL函数: Private pw_ As Long Private Sub class_initialize() pw_ = ProjectWiseAPI.CreateProjectWise(True) End Sub

调用C++;来自VBA的DLL,获取;访问冲突写入位置“;错误 我有一个Excel VBA项目,我试图从VisualStudio 2013输出的C++ DLL调用函数。我已经添加了对DLL的引用。当我尝试在VS调试器中运行它时,它连接到Excel实例,在该实例中我使用以下方法调用DLL函数: Private pw_ As Long Private Sub class_initialize() pw_ = ProjectWiseAPI.CreateProjectWise(True) End Sub,c++,excel,vba,dll,visual-studio-2013,C++,Excel,Vba,Dll,Visual Studio 2013,我得到这个错误: Unhandled exception at 0x0EBE8536 (libProjectWise.dll) in EXCEL.EXE: OxC0000005: Access violation writing location 0xFFFFFFFF. File not found: T:\location\of\dll\libProjectWise.dll 它在此函数中中断: PWAPI CreateProjectWise(LPVOID *obj, VARIANT_BO

我得到这个错误:

Unhandled exception at 0x0EBE8536 (libProjectWise.dll) in EXCEL.EXE: 
OxC0000005: Access violation writing location 0xFFFFFFFF.
File not found: T:\location\of\dll\libProjectWise.dll
它在此函数中中断:

PWAPI CreateProjectWise(LPVOID *obj, VARIANT_BOOL showErrors) {
    *obj = new XYZ_ProjectWise::ProjectWise(showErrors != FALSE);
    return S_OK;
}
[
        helpstring("Gets an instance of the API object"),
        entry("_CreateProjectWise@8")
]
HRESULT __stdcall CreateProjectWise([in] VARIANT_BOOL showErrorMessage, [out, retval] long *obj);
特别是在
*obj
分配行上

此外,当我只是单独使用Excel文件而不是使用VS时,当我编译VBA项目时,我会遇到以下错误:

Unhandled exception at 0x0EBE8536 (libProjectWise.dll) in EXCEL.EXE: 
OxC0000005: Access violation writing location 0xFFFFFFFF.
File not found: T:\location\of\dll\libProjectWise.dll
即使我已将DLL、EXP、ILK、LIB、MAP和PDB文件复制到
T:\location\of\DLL
文件夹,并且我的ODL文件包含以下行:

[
   dllname("T:\location\of\dll\libProjectWise.dll")
]
我被这一切弄糊涂了。我没有编写这个API,我对C++有了粗略的了解,以及如何在VisualStudio中开发它。原始开发人员不可用

编辑: 以下是
CreateProjectWise
函数的ODL代码:

PWAPI CreateProjectWise(LPVOID *obj, VARIANT_BOOL showErrors) {
    *obj = new XYZ_ProjectWise::ProjectWise(showErrors != FALSE);
    return S_OK;
}
[
        helpstring("Gets an instance of the API object"),
        entry("_CreateProjectWise@8")
]
HRESULT __stdcall CreateProjectWise([in] VARIANT_BOOL showErrorMessage, [out, retval] long *obj);

<>这是不可能的C++签名匹配该调用。C++有两个参数,调用只有一个。因此,不可能从VBA传递
showErrors
,而
obj
是存储在
pw
中的返回值的缓冲区

查看函数的ODL,很明显参数顺序与定义相反。因此,VBA的 SeaReReMebug <代码>参数被视为C++中的指针,具有可预测的坏结果。
MIDL编译器在处理ODL时创建头文件。<>代码>包含在C++或C++代码中的这个头文件,并实现,这样编译器就可以自动捕获这样的问题。

你需要显示更多的IDL,特别是注释,例如< > >,ReTVA] < /Cord>。添加了此函数的ODL。在比较ODL和函数体时,是否发现任何可疑之处?例如,参数名称、类型和返回类型不匹配?如果ODL的括号中有错误的部分,则添加了正确的一侧问题:是否尝试过?我在PWAPI定义中反转了参数,但现在我发现
找不到DLL入口点_CreateProjectWise@8
当我试图从VS调试器运行它时。@sigil:
PWAPI
定义?类似于
#define PWAPI HRESULT u stdcall u declspec(dllexport)
?不,我指的是我在原始问题中包含的
PWAPI CreateProjectWise(LPVOID*obj,VARIANT\u BOOL-showers)
。我把
LPVOID*obj
放在末尾,结果得到了
找不到DLL入口点的结果。@sigil:ah,这就是
CreateProjectWise
的定义。这只是32位编译,对吗?使用
dumpbin/exports
比较在重新排列参数之前和之后导出的函数。问题是我还没有反转头文件
libProjectWise.h
中函数声明中的参数。