vb.net调用三方dll api出现PInvoke问题,请教各位大师....

ericwong0914 2009-09-08 07:13:28
使用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返回的是指针所致,不过实在是没找到解决办法,求教各位大虾,是否有好的解决办法??




...全文
126 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ericwong0914 2009-09-10
  • 打赏
  • 举报
回复
自己顶....
threenewbee 2009-09-09
  • 打赏
  • 举报
回复
还有 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里面引用。
threenewbee 2009-09-09
  • 打赏
  • 举报
回复
Dim a() As Byte 修改为 Public a() As Byte
依次类推。
ericwong0914 2009-09-09
  • 打赏
  • 举报
回复
刚才测试了一下,准备用IntPtr取返回的结构,然后用Marshal.PtrtoStructure将IntPtr转换至结构,结果还是提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”。。。。
ericwong0914 2009-09-09
  • 打赏
  • 举报
回复
修改为As Long后,运行提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”,完全要昏倒了~ 还请高手赐教!
ericwong0914 2009-09-08
  • 打赏
  • 举报
回复
感谢caozhy的帮助,问题还是没有解决。
测试时还是提示“方法的类型签名与 PInvoke 不兼容”,晕了,折腾了两天了~
threenewbee 2009-09-08
  • 打赏
  • 举报
回复
给结构体加上:
<StructLayout(LayoutKind.Sequential)>
ericwong0914 2009-09-08
  • 打赏
  • 举报
回复
去掉了,还是同样的报错~
threenewbee 2009-09-08
  • 打赏
  • 举报
回复
Public Sub Initialize()
Redim a(10)
Redim b(12)
Redim c(3)
Redim e(200)
Redim g(200)
去掉

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧