+ -
当前位置:首页 → 问答吧 → VB有关指针字符的问题.

VB有关指针字符的问题.

时间:2011-08-30

来源:互联网

VB引用一个DELPHI的接口
DELPHI中的使用
 function ReadCardMsg(incom : integer;user_code :pchar;card_key :
  pchar;Card_id : pchar;Card_no :pchar;limit_money : pchar) : integer; stdcall;
  external 'rf_carddll.dll' name 'ReadCardMsg';


var
  cardid,cardno,limit_money : pchar;
  i : integer;

  GetMem(cardid,16);
  GetMem(cardno,16);
  GetMem(limit_money,16);

  i := ReadCardMsg(strtoint(edit1.Text),pchar(edit2.Text),pchar(edit3.Text),cardid,cardno,limit_money);
....
  edit5.Text := string(cardid);
  edit6.Text := string(cardno);
....
  FreeMem(cardid);
  FreeMem(cardno)

VB中使用时,有问题,应该怎么修改?

其中card_id ,card_no,limit_money返回的是指针地址

Private Declare Function ReadCardMsg Lib "rf_carddll.dll" (ByVal incom As Integer, ByVal user_code As String, ByVal card_key As String, ByRef card_id As String, ByRef card_no As String, ByRef limit_money As String) As Integer


Dim code As Integer
Dim card_id As String, card_no As String, limit_money As String

code = ReadCardMsg(CInt(Text1.Text), Text2.Text, Text3.Text, ByVal VarPtr(card_id), ByVal VarPtr(card_no), ByVal VarPtrlimit_money))

...
  Text4.Text = card_id
  Text5.Text = card_no

作者: zmphy   发布时间: 2011-08-30

试验后有什么结果嘛?

作者: Veron_04   发布时间: 2011-08-30

"0x00c284d0"指令引用的"0X00000000"内存,该内存不能为"written"

作者: zmphy   发布时间: 2011-08-30

VB自动关闭

作者: zmphy   发布时间: 2011-08-30

VB code

Private Declare Function ReadCardMsg Lib "rf_carddll.dll" (ByVal incom As Integer, ByVal user_code As long, ByVal card_key As long, ByRef card_id As long, ByRef card_no As long, ByRef limit_money As long) As Integer


试试

作者: BestBadGod   发布时间: 2011-08-30

to BestBadGod
user_code,card_key是字符
你的方法我试了,一样,如果编译成EXE的话,不报错,但没结果,直接退出.

作者: zmphy   发布时间: 2011-08-30

code = ReadCardMsg(CInt(Text1.Text), Text2.Text, Text3.Text, ByVal VarPtr(card_id), ByVal VarPtr(card_no), ByVal VarPtrlimit_money))

其实CODE我已经通过调试知道了结果,是正确的
问题应该是返回CARD_ID,CARD_NO时的错.

作者: zmphy   发布时间: 2011-08-30

在DELPHI中调用函数正常吗

作者: BestBadGod   发布时间: 2011-08-30

在DELPHI中一切正常,现在要用VB调,结果一直不行.

作者: zmphy   发布时间: 2011-08-30


Private Declare Function ReadCardMsg Lib "rf_carddll.dll" (ByVal incom As Long, ByVal user_code As String, ByVal card_key As String, ByRef card_id As Byte, ByRef card_no As Byte, ByRef limit_money As Bye) As Long

Dim code As Long
Dim card_id(255) As Byte, card_no(255) As Byte, limit_money(255) As Byte

code = ReadCardMsg(CInt(Text1.Text), Text2.Text, Text3.Text, card_id(0), card_no(0), limit_money(0))

...
  Text4.Text = StrConv(card_id, vbUnicode)
  Text5.Text = StrConv(card_no, vbUnicode)

作者: of123   发布时间: 2011-08-30

to of123
非常感谢,
Text4.Text = StrConv(card_id, vbUnicode)
Text5.Text = StrConv(card_no, vbUnicode)
已经取出值了,而且也DELPHI的程序的值是一样的,非常感谢.
现在还有一个问题,取出值以后,我就没有操作了,但是还是报
"0x00c284d0"指令引用的"0X00000000"内存,该内存不能为"written"

作者: zmphy   发布时间: 2011-08-30

VB code

Option Explicit



Private Declare Function ReadCardMsg Lib "rf_carddll.dll" (ByVal incom As Long, _
                                                           ByRef user_code As String, _
                                                           ByRef card_key As String, _
                                                           ByRef card_id As Byte, _
                                                           ByRef card_no As Byte, _
                                                           ByRef limit_money As Byte) As Long


 
 




Private Sub Command1_Click()
    Dim code As Long
    Dim strUserCode As String
    Dim strCardKey As String
    Dim card_id(255) As Byte, card_no(255) As Byte, limit_money(255) As Byte
    strUserCode = Text2.Text
    strCardKey = Text3.Text
    
    code = ReadCardMsg(CInt(Text1.Text), StrPtr(strUserCode), StrPtr(strCardKey), card_id(0), card_no(0), limit_money(0))
    Text4.Text = StrConv(card_id, vbUnicode)
    Text5.Text = StrConv(card_no, vbUnicode)
End Sub


作者: Veron_04   发布时间: 2011-08-30

麻烦高手再指点一下
在调试模式下,
code = ReadCardMsg(CInt(Text1.Text), Text2.Text, Text3.Text, card_id(0), card_no(0), limit_money(0))

报错"0x00c284d0"指令引用的"0X00000000"内存,该内存不能为"written"
编译成EXE后,
Text4.Text = StrConv(card_id, vbUnicode)
Text5.Text = StrConv(card_no, vbUnicode)
已经取到了正确的值,然后再报错
报错"0x00c284d0"指令引用的"0X00000000"内存,该内存不能为"written"

作者: zmphy   发布时间: 2011-08-30