1、用Delphi编写DLL,如果VB、VC++等想调用,必须使用PChar类型。String是一个挺有意思的类型,引进它主要是为了解决内存泄露的问题,有点类似VC++中的CString类型。给你两个API希望对你有所帮助: function GetStrAllocSize(const S: string): Longint; var P: ^Longint; begin P := Pointer(S); Dec(P, 3); Result := P^ and not $80000000 shr 1; end;function GetStrRefCount(const S: string): Longint; var P: ^Longint; begin P := Pointer(S); Dec(P, 2); Result := P^; end;2、Jean说得不对,肯定是可以的,例如声明: procedure DeleteMe(const id: Integer; PBuff: PChar = nil); 用DeleteMe(0)和DeleteMe(0, APointer)都可以调用。
关于第二个问题由于不熟悉Delphi,无法回答。
包括Boolean,Byte,Smallint,Integer,Word等和枚举类型。
function GetStrAllocSize(const S: string): Longint;
var
P: ^Longint;
begin
P := Pointer(S);
Dec(P, 3);
Result := P^ and not $80000000 shr 1;
end;function GetStrRefCount(const S: string): Longint;
var
P: ^Longint;
begin
P := Pointer(S);
Dec(P, 2);
Result := P^;
end;2、Jean说得不对,肯定是可以的,例如声明:
procedure DeleteMe(const id: Integer; PBuff: PChar = nil);
用DeleteMe(0)和DeleteMe(0, APointer)都可以调用。
VC 中的CString 和 VB 中的String 也是两码事。
在COM中较多使用的BSTR用于参数传递。BSTR即Basic String 是为了照顾VB。
Delphi和BCB 可以使用WideString 来实现BSTR。
2,PChar 作参数时可以有缺省值,如Lin 所说。
第一个问题
在标准的Pascal中,string类型式如此定义,
var
aString :string;
aString[0]是字符串的长度,字符串以'$'字符结尾
但是Delphi中好像做了改动,我在delphi中定义了一个字符串变量,然后跟踪内存地址,发现这个字符串是以NULL结尾。
为什么不考虑PChar??delphi中dll使用string,help中写的很清楚.
delphi中的string使用引用计数和copy-on-write所以做到dll中比较麻烦.