首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphi 7 string 的内存结构 (vc调用delphi dll)解决办法

2012-05-14 
delphi 7 string 的内存结构 (vc调用delphi dll)别人提供的delphi动态库,我要用vc调用,但是库里的参数有 s

delphi 7 string 的内存结构 (vc调用delphi dll)
别人提供的delphi动态库,我要用vc调用,
但是库里的参数有 string 类型,不知道要怎么调用。

问下delphi 7 string 的内存结构,看是否可以构造出 相同内存结构的 “string”传入。

或者谁能告诉我 其他的调用办法?

[解决办法]
从书上摘抄的

Delphi(Pascal) code
字符串可以分为三大类:短字符串(ShortString)、长字符串(AnsiString /LongString)、宽字符串(WideString)。ShortString 在内存中占用0..255 字节,也就是说,它被固定分配256 字节。其中第0 字节存储字符串的实际长度,因此,一个ShortString 类型的变量实际最多存储255 个字符;但是,即使实际存储的字符不到255 个,它仍然在内存中霸道地占据256 字节。所以为了避免浪费,Object Pascal 又提供了另一种方法来声明更短的ShortString 变量:String[MaxLength]。一个String[MaxLength]类型的ShortString 占据0..MaxLength 共MaxLength+1 个字节。当然MaxLength 必须小于256。String 等同于AnsiString,否则等同于ShortString
[解决办法]
这个可能真不行。能不能让那个人改一下,在dll中怎么能用string做参数,这本身就有问题,就如同在vc++中用CString做参数一样,为什么不用PChar?用string不知道会有什么隐式问题,到时候调试都困难。
[解决办法]
没什么问题
delphi7的string类型,就是一块连续的内存,其中前四个字节是引用计数4字节 再后面是长度4字节, 后面就是内容ansistring,一个字符占一个字节。
传递时把地址传入即可
[解决办法]
一般做成dll的输出函数了,参数不会使用string而是pchar了的吧?
[解决办法]
哦,上面给的结构有错误,抱歉啊,重来。
应该是这样:
Delphi(Pascal) code
  StrRec = packed record    refCnt: Longint; //引用计数,4个字节    length: Longint; //字符串长度,4个字节    Str:array[0..length-1] of Char; //实际字符串,实际长度是length中的长度  end;
[解决办法]
c/c++可以写成:

typedef struct
{
int refCount;
int lenght;
TCHAR data[1];
}dString, *LPDString;



[解决办法]
探讨

c/c++可以写成:

typedef struct
{
int refCount;
int lenght;
TCHAR data[1];
}dString, *LPDString;

[解决办法]
我用的是Delphi2010.Delphi2009之前只要去掉CodePage和elemSize是一样的.
procedure TForm1.Button1Click(Sender: TObject);
type
PStrRec = ^StrRec;
StrRec = packed record
codePage: Word; //语言,Delphi2009之前没有这个域
elemSize: Word; //语言,每个元素(可以理解成字符)大小,Delphi2009之前没有这个域
refCnt: Longint; //引用计数
length: Longint; //长度
data : array[0..0] of Char; //数据,实际长度以length+1为准,最后有一个#0
end;
var
s : string;
p : Integer;
pstr : PStrRec;
begin
s := '1000'; //如果是字符串常量的话引用计数为-1.
s := s + 'a';//这次引用计数应该是1

p := Integer(s);//string本身是个指针,指向StrRec.data
pstr := PStrRec(p - 12); //取到 StrRec 的地址
ShowMessage(Format('语言:%d;元素大小:%d;引用计数:%d;字符串长度%d;字符串内容:"%s"',[pstr.codePage, pstr.elemSize, pstr.refCnt, pstr.length, PChar(@pstr.data)]));
end;

热点排行