我现在正在写一个DLL,看书上说最好不要使用STRING,应该用PCHAR,所以我把所有STRING类型的数据改为PCHAR型了,但是新的问题出现了,有些DELPHI的函数是要用到STRING的,如
var
a : pchar
begin
setlength(a,64);
delete(a,1,5);
end;
这两个函数都分别报出了错误,请问该如何解决呢?
end
...全文
20318打赏收藏
关于DLL的问题,我没有办法了,请各位帮忙啊
各位大哥大姐,问个问题: 我现在正在写一个DLL,看书上说最好不要使用STRING,应该用PCHAR,所以我把所有STRING类型的数据改为PCHAR型了,但是新的问题出现了,有些DELPHI的函数是要用到STRING的,如 var a : pchar begin setlength(a,64); delete(a,1,5); end; 这两个函数都分别报出了错误,请问该如何解决呢? end
(*
* 功能:根据分隔符,完成字符串的分解,把结果加入到列表中返回
* 参数说明:
* const aValue:stirng 要进行分隔的字符串
* strDelimiter:string; 分隔符,字符个数没有限制
* 返回结果:
*)
function SplitEx(const aValue:string;strDelimiter:string):TStringList;
var
Size,CurPos,EndPos:Integer;
Value:string;
begin
Result := TStringList.Create();
CurPos := 1;
EndPos := strPos(strDelimiter,aValue,CurPos);
while(EndPos > 0) do
begin
Size := EndPos - CurPos;
if Size > 0 then
begin
Value := Copy(aValue,CurPos,Size);
Result.Add(Value);
end;
CurPos := EndPos + Length(strDelimiter);
EndPos := strPos(strDelimiter,aValue,CurPos);
end;
Size := Length(aValue) - CurPos + 1;
Value := Copy(aValue,CurPos,Size);
Result.Add(Value);
end;
//
function StrPos(const FindString, SourceString: string; StartPos: Integer): Integer;
asm //find http://www......
PUSH ESI
PUSH EDI
PUSH EBX
PUSH EDX
TEST EAX,EAX
JE @@qt
TEST EDX,EDX
JE @@qt0
MOV ESI,EAX
MOV EDI,EDX
MOV EAX,[EAX-4]
MOV EDX,[EDX-4]
DEC EAX
SUB EDX,EAX
DEC ECX
SUB EDX,ECX
JNG @@qt0
XCHG EAX,EDX
ADD EDI,ECX
MOV ECX,EAX
JMP @@nx
@@fr: INC EDI
DEC ECX
JE @@qt0
@@nx: MOV EBX,EDX
MOV AL,BYTE PTR [ESI]
@@lp1: CMP AL,BYTE PTR [EDI]
JE @@uu
INC EDI
DEC ECX
JE @@qt0
CMP AL,BYTE PTR [EDI]
JE @@uu
INC EDI
DEC ECX
JE @@qt0
CMP AL,BYTE PTR [EDI]
JE @@uu
INC EDI
DEC ECX
JE @@qt0
CMP AL,BYTE PTR [EDI]
JE @@uu
INC EDI
DEC ECX
JNE @@lp1
@@qt0: XOR EAX,EAX
@@qt: POP ECX
POP EBX
POP EDI
POP ESI
RET
@@uu: TEST EDX,EDX
JE @@fd
@@lp2: MOV AL,BYTE PTR [ESI+EBX]
CMP AL,BYTE PTR [EDI+EBX]
JNE @@fr
DEC EBX
JE @@fd
MOV AL,BYTE PTR [ESI+EBX]
CMP AL,BYTE PTR [EDI+EBX]
JNE @@fr
DEC EBX
JE @@fd
MOV AL,BYTE PTR [ESI+EBX]
CMP AL,BYTE PTR [EDI+EBX]
JNE @@fr
DEC EBX
JE @@fd
MOV AL,BYTE PTR [ESI+EBX]
CMP AL,BYTE PTR [EDI+EBX]
JNE @@fr
DEC EBX
JNE @@lp2
@@fd: LEA EAX,[EDI+1]
SUB EAX,[ESP]
POP ECX
POP EBX
POP EDI
POP ESI
end;
谁说的不能用,先看看Delphi的说明吧:
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
上面的意思就是说如果你的DLL中用到了string参数或者返回值,那么在DLL单元和工程单元的Uses字句中第一个引用ShareMem 单元.