数据类型基础问题,高手请进。(100分)

  • 主题发起人 主题发起人 rikhong
  • 开始时间 开始时间
R

rikhong

Unregistered / Unconfirmed
GUEST, unregistred user!
PAnsiChar如何能象string那样合并字符串,
function GetCmd_GunState(Despensor_no : PAnsiChar;Despensor_state : PAnsiChar):PAnsiChar;
var sendtxt:PAnsiChar;
begin
sendtxt:=Despensor_no+chr($6B)+chr($2C)+CHR($74)+chr($68)+chr($69)
+chr($73)+chr($20)+chr($69)+chr($66)+chr($20)+chr($66)+chr($6F)
+chr($72)+chr($20)+chr($68)+chr($73)+chr($00)+chr($00)+chr($00);
Result:=sendtxt;
end;
上面的语句编译出错
我想把十六进制通过变量来传递,Despensor_no要定义为什么类型才可以存放$6F,如果是integer的话chr(Despensor_no)这样又不行,我头都暴了,谁有好点的基础教程,给我推荐一本。诶,基础没学好,现在头痛了
 
直接用串变量不行吗?你那样是把它当字符了,而sendtxt被定义成了字符当然就不能做加法运算(连接)了。
 
function GetCmd_GunState(Despensor_no : PAnsiChar;Despensor_state :PAnsiChar;
begin
Result:= PAnsiChar(strpas(Despensor_no)+#$6B#$2C#$74#$68#$69#$73#$20#$69#$66#$20#$66#$6F
+#$72#$20#$68#$73#$00#$00#$00);
end;
 
function GetCmd_GunState(Despensor_no : PAnsiChar;Despensor_state : PAnsiChar):PAnsiChar;
var sendtxt:string;
TmpStr: string;
begin
TmpStr := Despensor_no;
sendtxt:=TmpStr+chr($6B)+chr($2C)+CHR($74)+chr($68)+chr($69)
+chr($73)+chr($20)+chr($69)+chr($66)+chr($20)+chr($66)+chr($6F)
+chr($72)+chr($20)+chr($68)+chr($73)+chr($00)+chr($00)+chr($00);
Result:=PAnsiChar(sendtxt);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
P1, P2: PAnsiChar;
begin
P1 := 'Hello';
ShowMessage(GetCmd_GunState(P1, P2));
end;
 
很多答案,呵呵
function GetCmd_GunState(Despensor_no, Despensor_state: string): string;
begin
Result := Despensor_no + #$6B#$2C#$74#$68#$69#$73#$20#$69#$66#$20#$66#$6F
+ #$72#$20#$68#$73#$00#$00#$00;
end;
在需要PAnsiChar类型时强制转换即可,PAnsiChar(Result);
 
我是用在DLL里的,用了STRING不会有问题吗?
 
在uses里加ShareMem就OK了

uses
ShareMem,
......
 
用PCHAR嘛, 多兼容的东西啊
 
不行啊,PCHAR类型在VB里没也没有,我编译出来的动态库VB下出错,但选了VB有的数据类型就没问题,字符串指针在VB里是什么?
 
function StrCat(Dest: PChar; const Source: PChar): PChar;

Description

Use StrCat to concatenate Source to the end of Dest. StrCat does not perform any length checking. The destination buffer must have room for at least StrLen(Dest)+StrLen(Source)+1 characters.

To check length, use the StrLCat function.
 
我 DLL 里的函数:
function GetCmd_GunState(Despensor_no : AnsiChar;Despensor_state : AnsiChar):AnsiChar;stdcall;
var sendtxt:AnsiChar;
value:integer;
begin
value:=StrToInt(Despensor_no);
sendtxt:=pchar(chr(value)+#$6B#$2C#$74#$68#$69#$73#$20#$69#$66#$20#$66#$6F#$72#$20#$68#$73#$00#$00#$00);
//6F 6B 2C 74 68 69 73 20 69 66 20 66 6F 72 20 68 73 00 00 00
Result:=sendtxt;
end;
VB里调用:
Declare Function SetGunState Lib "C:/HScom.dll" (Despensor_no As String, Despensor_state As String, protocol As String) As String
VB和DELPHI数据类型对照表:
* VB、Delphi和C++数据类型对照表 *

字长/值域 VB Delphi C++

8位有符号整型 Integer ShortInt signed char
16位有符号整型 Integer SmallInt short
32位有符号整型 long Long Long
8位无符号整型 byte Byte unsigned char
16位无符号整型 byte Word unsigned short
32位有符号整型 Integer Integer int
32位无符号整型 Integer Cardinal unsigned int
布尔型 Boolean Boolean bool
真/假 或 16位无符号整型 ByteBool unsigned char
真/假 或 16位无符号整型 WordBool unsigned short
真/假 或 32位无符号整型 LongBool BOOL (WinAPI)
8位无符号字符 string AnsiChar char
宽字编码字符 string WideChar wchar_t
8位无符号字符 string Char char
AnsiString类 string String AnsiString
32位浮点数 single Single float
64位浮点数 double Double double
80位浮点数 Extended long double
32位浮点数 Real double
32无类型指针 Pointer void *
32位字符型指针 Pchar unsigned char *
32位ANSI型字符指针 PAnsiChar unsigned char *
64位浮点数 Comp Comp 类
OLE可变类型值 OleVariant OleVariant 类
 
我DLL里改用了以下的类型
AnsiChar char WideChar String 都会出错
指针VB里没有,
 
DLL里函数的类型是参数类型是PAnsiChar,返回也是PAnsiChar,更正一下
 
function GetCmd_GunState(Despensor_no : AnsiChar;Despensor_state : AnsiChar;var ResultChar:AnsiChar):AnsiChar;stdcall;
//---在函数定义里定义一个回调参数吧。这样可能更容易些。至于回调参数的数组有多长,你自己可以想办法知道的。呵~~

BTW:DELPHI里的STRING类型与VB里的STRING类型是同一个类型的数据类型,可以使用的。
 
现在已经可以在VB里调用了,但是VB程序在调用后关闭程序就会出错,读内存出错
VB程序如下:
Declare Sub SetGunState Lib "C:/HScom.dll" (ByRef Despensor_no As String, Despensor_state As String, protocol As String)


Private Sub Command1_Click()
Dim s As String
s = "$6f"
Module1.SetGunState s, "", ""
Text1.Text = s
End Sub

DLL:
procedure SetGunState(var Despensor_no : string;Despensor_state : string;protocol : string);stdcall;
var
value:integer;
begin
value:=StrToInt(Despensor_no);

Despensor_no:=(chr(value)+#$6B#$2C#$74#$68#$69#$73#$20#$69#$66#$20#$66#$6F#$72#$20#$68#$73#$00#$00#$00);;

end;
 
后退
顶部