从VBA调用C ++ DLL,出现“访问冲突写入位置”错误

我有一个Excel VBA项目,我想从Visual Studio 2013输出的C ++ DLL中调用一个函数。我已经添加了对DLL的引用。 当我尝试在VSdebugging器中运行它时,附加到我使用以下函数调用DLL函数的Excel实例:

Private pw_ As Long Private Sub class_initialize() pw_ = ProjectWiseAPI.CreateProjectWise(True) End Sub 

我得到这个错误:

 Unhandled exception at 0x0EBE8536 (libProjectWise.dll) in EXCEL.EXE: OxC0000005: Access violation writing location 0xFFFFFFFF. 

它打破了这个function:

 PWAPI CreateProjectWise(LPVOID *obj, VARIANT_BOOL showErrors) { *obj = new XYZ_ProjectWise::ProjectWise(showErrors != FALSE); return S_OK; } 

特别是在*obj赋值行上。

另外,当我正在使用Excel文件本身,而不是与VS,当我编译VBA项目,我得到这个错误:

 File not found: T:\location\of\dll\libProjectWise.dll 

即使我已将DLL,EXP,ILK,LIB,MAP和PDB文件复制到T:\location\of\dll文件夹的T:\location\of\dll ,并且我的ODL文件包含以下行:

 [ dllname("T:\location\of\dll\libProjectWise.dll") ] 

所有这一切我都很困惑。 我没有编写这个API,我只对C ++有一个粗略的理解,以及如何在Visual Studio中进行开发。 原始的开发人员不可用。

编辑:这是CreateProjectWise函数的ODL代码:

 [ helpstring("Gets an instance of the API object"), entry("_CreateProjectWise@8") ] HRESULT __stdcall CreateProjectWise([in] VARIANT_BOOL showErrorMessage, [out, retval] long *obj); 

这个C ++签名不可能匹配那个调用。 C ++有两个参数,这个调用只有一个。 并且只允许在最后一个参数上使用[retval]属性 ,所以从VBA传递showErrors是不可能的,而obj是存储在pw_的返回值的缓冲区。

看看你的ODL的function,很显然,参数顺序与定义相反。 结果,来自VBA的showErrorMessage参数被当作C ++中的一个指针,带有可预见的错误结果。

MIDL编译器在处理ODL时创build一个头文件。 #include这个头文件在C或C ++代码中的实现非常有用,这样编译器就可以自动捕获这样的问题。