vb.net调用三方dll api出现PInvoke问题,请教各位大师....
使用vb.net调用一个三方dll,原三方dll的demo是用vb6写的,里面定义了一个type:Public Type SERVICE_Package
a(10) As Byte
b(12) As Byte
c(3) As Byte
d As Byte
e(200) As Byte
f As Byte
g(200) As Byte
End Type
我在vb.net中写了一个Structure,和VB6中的type一致:
Public Structure Service_Package
Dim a() As Byte
Dim b() As Byte
Dim c() As Byte
Dim d As Byte
Dim e() As Byte
Dim f As Byte
Dim g() As Byte
Public Sub Initialize()
Redim a(10)
Redim b(12)
Redim c(3)
Redim e(200)
Redim g(200)
End Structure
引入DLL的命令:
Public Declare Function RecvPackage Lib "WPDAPI.dll" _
() As Service_Package
测试的时候,一直报错“方法的类型签名与 PInvoke 不兼容”,在网上查了些资料,也看了部分P/INVOKE资料,估计是P/Invoke返回的是指针所致,不过实在是没找到解决办法,求教各位大虾,是否有好的解决办法??
--------------------编程问答-------------------- Public Sub Initialize()
Redim a(10)
Redim b(12)
Redim c(3)
Redim e(200)
Redim g(200)
去掉 --------------------编程问答-------------------- 去掉了,还是同样的报错~ --------------------编程问答-------------------- 给结构体加上:
<StructLayout(LayoutKind.Sequential)> --------------------编程问答-------------------- 感谢caozhy的帮助,问题还是没有解决。
测试时还是提示“方法的类型签名与 PInvoke 不兼容”,晕了,折腾了两天了~ --------------------编程问答-------------------- Dim a() As Byte 修改为 Public a() As Byte
依次类推。 --------------------编程问答-------------------- 还有 Public Declare Function RecvPackage Lib "WPDAPI.dll" _
() As Service_Package 改成
Public Declare Function RecvPackage Lib "WPDAPI.dll" _
() As Long
看看返回什么。
实在不行,还有2个办法:
(1)使用.NET自动升级VB6程序。
(2)将VB6程序包装成ActiveX DLL,在.NET里面引用。 --------------------编程问答-------------------- 修改为As Long后,运行提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”,完全要昏倒了~ 还请高手赐教! --------------------编程问答-------------------- 刚才测试了一下,准备用IntPtr取返回的结构,然后用Marshal.PtrtoStructure将IntPtr转换至结构,结果还是提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”。。。。 --------------------编程问答-------------------- 自己顶....
补充:.NET技术 , VB.NET