日期:2014-05-19  浏览次数:21013 次

卡在C#调用C写的DLL传递指针?请教高手
遇到一个dll,其中他的一个函数如下
  Function:
Acquire   ID   data   from   ID   information   table   in   the   internal   DLL   file.
  Form:
int   hst_idtblgetid(long   recno,   UCHAR   *iddata)
  Parameter:
recno Designated   record   number   of   acquired   ID   data
1~128
iddata Stored   pointer   for   acquired   ID   data
  Return   value:
0 Normal   End.
-1 Abnormal   End.  
关于这个UCHAR   *iddata实在是郁闷,因找厂商无果,只能自己尝试
经过察看其vb代码,估计该函数调用后会返回iddata值。
vb代码如下
引用:
Public   Declare   Function   hst_idtblgetid   Lib   "c:\HostCM32.dll "   (ByVal   recno   As   Long,   ByVal   iddata   As   String)   As   Integer        
代码:
idret   =   "000000 "
ret   =   hst_idtblgetid(1,   idret)
If   ret   =   0   Then
    MsgBox   "   ok     two   "   &   idret
Else
    MsgBox   iddata
End   If
老是:
未处理的“System.NullReferenceException”类型的异常出现在   firec.exe   中。

其他信息:   未将对象引用设置到对象的实例

写下过程,请高手帮忙解答。
1、使用byte[]
引用部分:
[DllImport( "HostCM32.dll ")]
private   static   extern   int   hst_idtblgetid(long   recno,out   byte[]   iddata);
代码:
byte[]   abc=System.Text.Encoding.Default.GetBytes( "000000 ");
ret   =   hst_idtblgetid(0,out   abc);
经尝试ref同样出错
2、使用string   []
private   static   extern   int   hst_idtblgetid(long   recno,   out     string   []   iddata);
代码:
string[]   abc=new   string[6]   ;
for(int   k=0;k <6;k++)
abc[k]= "0 ";
ret   =   hst_idtblgetid(0,out   abc);
同样尝试了ref  
 
3、使用StringBuilder
同样
4、
private   static   extern   int   hst_idtblgetid(long   recno,       System.IntPtr   iddata);

byte[]   abc=System.Text.Encoding.Default.GetBytes( "000000 ");
System.IntPtr   bp   =   Marshal.UnsafeAddrOfPinnedArrayElement(   abc   ,   0   );
ret   =   hst_idtblgetid(0,   bp);
5、char[]这个牵扯参数封装问题,估计也不行就没往下试

代码
char[]   abc=new   char   [7]   ;
for(int   k=0;k <6;k++)
abc[k]= '0 ';
abc[6]= '\0 ';
ret   =   hst_idtblgetid(0,ref   abc );



------解决方案--------------------
vb代码如下
引用:
Public Declare Function hst_idtblgetid Lib "c:\HostCM32.dll " (ByVal recno As Long, ByVal iddata As String) As Integer
代码:
idret = "000000 "
ret = hst_idtblgetid(1, idret)
If ret = 0 Then
MsgBox " ok two " & idret
Else
MsgBox iddata
End If

这个是不是VB6下面的代码??是否可以正常使用??
------解决方案--------------------
private static extern int hst_idtblgetid(int recno, string iddata);

这样就行了!

------解决方案--------------------
我是十三月,接上午和你讲的,估计要用unsafe将string的指针传进去了.
<