我有一个VB6 DLL,它包含对第三方组件的调用。当我从VB6调用我的DLL时,一切正常,但当我从vb.net(2.0框架目标 - VS2010)调用它时,我收到此错误:
发生了AccessViolationException
尝试读取或写入受保护的内存。这通常是一个 表明其他内存已损坏。
此错误仅发生在Windows 7上(Windows XP客户端工作正常)。
我看了这个,我发现的所有文章都谈到了宣言不正确。我没有声明任何API调用,第三方组件早期绑定在我的VB6 DLL中。我可以运行DLL,设置断点,然后进入我的VB6函数,但是在第三方组件中调用函数时出错。
我的VB6 DLL需要3个字符串和一个32位数字(VB6中的长整数)参数。我调用的第三方的DLL函数是一个字符串(bstrDNSID作为字符串是Intellisense在VB6中显示的)。这是错误的地方。
有谁知道如何解决这个问题?
更新 编组都没有帮助,所以我尝试在我的VB6 DLL中创建一个测试子。我硬编码了DLL测试子中的所有值。从VB6调用它时工作正常,但从.NET运行时会出现与上面相同的错误。同样有趣的是,当我从VB6 IDE运行VB6 DLL时,从.NET调用DLL时我没有收到错误。
答案 0 :(得分:0)
这并没有真正回答你的问题,但我无法在评论中使用这些例子。
当将字符串封送到来自.NET的非托管DLL调用时,我偶尔会收到AccessViolationException
,因为我没有指定正确的字符集。我通过显式将IntPtr
转换为我需要的字符集中的字符串来修复它。
[DllImport("MyDLL.dll", CharSet = CharSet.Ansi)]
static extern void do_something(IntPtr str);
void DoSomethingWrapper(string str) {
var ptr = Marshal.StringToHGlobalAnsi(str);
do_something(ptr);
}
您可能需要Marshal.StringToBSTR
。我不知道你是否可以用指针调用VB6函数,或者你是否必须在VB6 DLL中创建指针。
以下是您可能会觉得有用的问题:How can I get the charset VB6 is using?
答案 1 :(得分:0)
解决方法:
我找到了一个有效的解决方案。我只是在VB6中创建了一个名为第三方组件的ActiveX EXE。就像.NET的魅力一样。
另外值得注意的是,我从未创建过ActiveX EXE,也不知道regsvr32无法注册它。 Here是注册ActiveX EXE的正确方法。
答案 2 :(得分:-1)
VB6可能将整数声明为16位。这也是从VBA调用DLL的问题。解决方案应该是将整数更改为long