使用字符串和VBA与C+之间的另一个UDT在UDT上崩溃+; 我在VBA和C++之间有一个问题。 当我想重拨我的X阵列时,我的发布dll会崩溃。 如果我在调试中编译,它有时会工作,但当我查看我的X数组时,我有一个错误“应用程序定义的或对象定义的错误”

使用字符串和VBA与C+之间的另一个UDT在UDT上崩溃+; 我在VBA和C++之间有一个问题。 当我想重拨我的X阵列时,我的发布dll会崩溃。 如果我在调试中编译,它有时会工作,但当我查看我的X数组时,我有一个错误“应用程序定义的或对象定义的错误”,c++,excel,vba,C++,Excel,Vba,如果我不重拨X数组或删除s字符串,它工作得很好 VBA: C++: \u declspec(align(4))类型定义结构扩展数据 { LPX阵列; 整数计数; }扩展数据; __declspec(align(4))类型定义结构T { BSTR s; 扩展数据X; }T; __declspec(dllexport)int_uustdcall Cpp_D2(T*p) { double*x=NULL; HRESULT hr=SafeArrayAccessData(p->X.X,重新解释强制转换(&X

如果我不重拨X数组或删除s字符串,它工作得很好

VBA:

C++:

\u declspec(align(4))类型定义结构扩展数据
{
LPX阵列;
整数计数;
}扩展数据;
__declspec(align(4))类型定义结构T
{
BSTR s;
扩展数据X;
}T;
__declspec(dllexport)int_uustdcall Cpp_D2(T*p)
{
double*x=NULL;
HRESULT hr=SafeArrayAccessData(p->X.X,重新解释强制转换(&X));
安全访问数据(p->X.X);
返回0;
}

我使用Excel和Visual Studio 2010的32位版本编译C++ DLL。< /P> 在Mac电脑上,我在崩溃前收到一条信息:“内部错误(错误51)”。官方文档中关于此错误的信息如下:

Visual Basic中出现内部故障。除非此调用是由错误语句或Raise方法生成的,否则请与Microsoft产品支持服务部门联系,报告出现此消息的情况


我用这个例子来做这项工作:这个例子很好。

我不知道为什么内存会损坏,但我找到了一个解决办法。 我们不需要改变C++中的任何东西。在VBA上,目标是按如下方式传递用户定义类型ByVal的地址:

Call Cpp_D2(VarPtr(i))
Private Declare PtrSafe Function Cpp_D2 Lib "MyDLL.dll" (ByVal i As Long) As Long
<>和,改变C++函数的声明很重要:
Call Cpp_D2(VarPtr(i))
Private Declare PtrSafe Function Cpp_D2 Lib "MyDLL.dll" (ByVal i As Long) As Long

现在,当我在C++中使用了两个声明,而没有MIDL的用户定义类型的VBA时,

不应该<代码> DimeObjt作为t<代码> be >代码> DimeI作为t<代码>?是的!对不起,我编辑了,谢谢。