我正在编写一个C#应用程序来调用第三方VB6 DLL.我在References-> COM选项卡中添加了对VB6 DLL的引用.
DLL中的特定方法采用VB6 UDT(用户定义类型)作为参数.
此UDT在COM的自动生成的.NET包装器中显示为结构.该结构具有许多子UDT /结构以及VBA.Collection类型的成员(如.NET元数据所示).它还有常规数据类型,如string,short,double,int等.
我在我的C#代码中初始化这个结构为:
udtEmployee udtEmpData = default(udtEmployee);
Run Code Online (Sandbox Code Playgroud)
我也试过了
udtEmpData = new udtEmployee();
Run Code Online (Sandbox Code Playgroud)
如果我没有使用default或new初始化它,我无法编译我的C#代码,因为编译器抱怨使用未分配的变量.
我需要传递这个结构作为参考.我是这样做的:
clsEmployee.SetData(ref udtEmpData);
Run Code Online (Sandbox Code Playgroud)
在调用VB6 DLL的这个方法时,我收到错误:
错误:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.
原因是什么,解决方案是什么?
注意,我无法更改VB6 DLL,因为我没有其源代码.我正在使用VS 2005.
编辑1:
这是一个完整的背景:
有一个本地开发的ERP产品,它支持使用VB6的附加开发.它有一个配置文件,它指定要加载的附加DLL的名称.然后,这些插件将显示在ERP应用程序的菜单中.在菜单上单击,ERP调用名为StartAddOn()的函数,该函数应存在于VB6 DLL中.
我想在C#中开发附加组件,所以我开发了一个带有StartAddOn方法的简单VB6插件,后者又将控制权传递给我的.NET DLL.
.NET DLL使用ERP公开的业务类,并来回传递数据对象.在.NET DLL中,我添加了对ERP供应商发布的DLL的COM引用.
所以架构是这样的:ERP-> VB6 AddOn和StartAddOn方法 - > .NET DLL->使用ERP供应商发布的COM DLL及其数据类(结构/ UDT).
如何调试内存错误?
VBA监视列表允许您在逐行浏览宏时监视变量.有没有办法扩展监视列表中包含的对象的所有属性,并在其中搜索特定文本?观察列表中的一行可以复制到记事本或单词等中,但似乎没有办法导出监视列表的全部内容或一次搜索所有行.
我试图确定Excel电子表格上对象的特定属性是什么.能够在观察列表中找到其中包含的文本将大大加快我的搜索速度.
有没有办法在循环中请求控件属性?
我需要这样的东西:
For each p in control.properties
if p = "Value" then
msgbox "I Have Value Property"
elseif p = "Caption" then
msgbox "I Have Caption Property"
end if
next
Run Code Online (Sandbox Code Playgroud)
它可以以某种方式完成?