当前位置:编程学习 > C#/ASP.NET >>

江湖救急:vc结构体字符数组VB.NET如何使用的问题!!

vc下的结构体:
  typedef struct tagIDData{
char Name[32];   
char Sex[4];   
char Nation[6];
char Born[18]; 
}IDData;
Data _stdcall GetDataMsg();


我在VB.net中:
  Declare Function GetDataMsg Lib "IDRead.DLL" () As IDData

  Structure IDCardData
      <VBFixedstring(32)> Dim Name() As string
      <VBFixedstring(4)> Dim Sex() As string
      <VBFixedstring(6)> Dim Nation() As string
      <VBFixedstring(18)> Dim Born() As string
  End Structure

  Dim Msg as IDData
  IDData = GetDataMsg ()
  Dim Nname ,N易做图,Nnation,Nborn as string
  Nname = IDData.name
  ......
我不知道我哪写错了,各位师傅给点指导!!谢谢
你的一句金言,能使小弟茅塞顿开啊!!
在此先谢过!! --------------------编程问答-------------------- 在线等各位高手指教!!...... --------------------编程问答-------------------- 参考如下:
<VBFixedString(64), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=64)> Public szName As String --------------------编程问答-------------------- 不行。提示:
IDData = GetDataMsg () 
中GetDataMsg () 的值无法转换为IDData 的1维数组。。


等指教!!!.....// --------------------编程问答-------------------- 到这步就出问题了:
IDData = GetDataMsg () 

提示:GetDataMsg () 的值无法转换为IDData 的1维数组。。  --------------------编程问答-------------------- 定义如下
<VBFixedString(32), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=32)> Public Name As String
而不是
<VBFixedString(32), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=32)> Public Name() As String。
不行把声明的贴出来看下。
--------------------编程问答-------------------- Structure IDCardData
       <VBFixedString(32), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=32)> Dim Name As String
        <VBFixedString(4), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=4)> Dim Sex As String
        <VBFixedString(6), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=6)> Dim Nation As String
        <VBFixedString(18), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=18)> Dim Born As String     End Structure

我把修改的地方贴出来了。
现在程序运行提示错误为:
 
 方法的类型签名与PInvoke不兼容。 --------------------编程问答-------------------- jf 
--------------------编程问答-------------------- 会不会是因为VC的Char和VB.NET的String的字节大小不一样。
两个不能转换啊。

??????????????????
请教中.... --------------------编程问答-------------------- GetDataMsg 你怎么定义的? --------------------编程问答-------------------- 你定义成BYTE数组试下:
Structure IDCardData 
      <VBFixedArray(31)> Dim Name() As Byte 
Public Sub Initialize()
ReDim Name(31)
End Sub
End Structure --------------------编程问答-------------------- 不行,没成功,还是

方法的类型签名与PInvoke不兼容。

回答gyc 问题:GetDataMsg 你怎么定义的?
Data _stdcall GetDataMsg(); 

我在VB.net中: 
  Declare Function GetDataMsg Lib "IDRead.DLL" () As IDData --------------------编程问答-------------------- 这个问题到现在也没解决。
大伙来帮帮俺啊!!!! --------------------编程问答--------------------
引用 4 楼 yzcjun2005 的回复:
到这步就出问题了: 
IDData = GetDataMsg () 

提示:GetDataMsg () 的值无法转换为IDData 的1维数组。。 
--------------------编程问答-------------------- 能不能把GetDataMsg () 返回值給拆分出來
通過循環去賦值 --------------------编程问答-------------------- 楼上兄弟,能详解吗?

举个例子。 --------------------编程问答-------------------- 现在的问题,我估计,可能是在VC的Char ,转化到VB.net中出了问题。

在vb.net到底是用:byte,还是string,还是char.

郁闷中。。。 --------------------编程问答-------------------- 试下如下看行不行:
Structure IDCardData 
      <VBFixedString(32), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=32)> Dim Name As String 
        <VBFixedString(4), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=4)> Dim Sex As String 
        <VBFixedString(6), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=6)> Dim Nation As String 
        <VBFixedString(18), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=18)> Dim Born As String    End Structure 
Declare Function GetDataMsg Lib "IDRead.DLL" () As <MarshalAs(UnmanagedType.LPArray)> IDData

--------------------编程问答--------------------  Declare Function GetDataMsg Lib "IDRead.DLL" () As IDData

这种声明我还没有用过
楼主,可以试着改成ImportDLL (如果没有记错的话, 不然就是DLL在前边)
或者将那个社名中  ()  去掉, ()这个可能被VB理解成了 数组


仔细看看好像还有很多问题哦,
楼主可能不小心 都声明成 空空的数组了

  Declare Function GetDataMsg Lib "IDRead.DLL"  As IDData 

  Structure IDCardData 
      <VBFixedstring(32)> Dim Name As string 
      <VBFixedstring(4)> Dim Sex As string 
      <VBFixedstring(6)> Dim Nation As string 
      <VBFixedstring(18)> Dim Born As string 
  End Structure 
补充:.NET技术 ,  VB.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,