Delphi 2010 的Char
今天用delphi 2010,做一个简单的内存映射的程序,在delphi以前版本上跑的好好的程序,在2010上,居然出现了不同的效果,发送端发送的字符串,接收端只收到一半,大概程序如下:
发送端:
var
str : String;
begin
CopyMemory(@(PShare^.Data),str,Length(str)); //把数据拷贝到共享内存
end;
接收端:
mmo1.Text := PShare^.Data;
查找帮助,Length的帮助中有那么一句话:For Unicode (WideString) strings, Length returns the number of bytes divided by two.
莫非是Unicode在捣鬼?上网查查,发现delphi2010里面大范围的使用了Unicode格式,pChar也从以前Ansi格式的1byte,变成2byte,在Lengh的时候就除以2,那么我这个str里面不管有什么当然就会被腰斩了。
怎么解决呢?
万一老师说,可以用ByteLength函数,但是也有人说,ByteLength函数只能对Unicode字符串求字节长度,如果要对Ansi字符串进行计算,那么结果会是正确值的两倍,虽然在这个程序中,ByteLength函数足够满足我的需求了,但是为了养成良好的习惯,我采用了另外一种方法,就是Length(str)*SizeOf(Char),这样不管是求AnsiChar还是Unicode Char的字符长度,都可以适用了。
发送端程序修改之后:
CopyMemory(@(PShare^.Data),str,Length(str)*SizeOf(Char));
经过测试,成功了!
相关文档:
Delphi 能不能从Ring 3进入Ring 0?
楼主skyworld_xm(skyworld)2004-11-19 09:58:55 在 Delphi / Windows SDK/API 提问
Delphi 能不能从Ring 3进入Ring 0?
有例子吗?
多谢. 问题点数:100、回复次数:20Top
1 楼jinjazz(近身剪)回复于 2004-11-19 10:13:27 得 ......
参考资料
李战.《悟透delphi》,第1章“DELPHI的原子世界”
“探索Delphi类与对象的内存结构”
基本知识
动态内存与静态内存
当程序运行时,系统首先将所有数据装载入内存,完成初始化,然后从入口地址开始执行代码。
程序装载后即存在于内存空间中的数据我们称之为静态内存,运行过程中 ......
本书通过典型的实例,系统地介绍了Delphi典型组件的基本使用方法和一些使用技巧。每一个实例都提供了程序的源代码、操作步骤,并且在一些特殊的实例中注明了知识点。力争使读者通过阅读实例后,可以较好地掌握每一个知识点。 本书分为五章,内容由浅入深、循序渐进,适用于初级用户和院校师生学习参考。 下载阅读边用边学D ......
Delphi 中将对象作为参数传递的使用 举例分析
2009-07-24 13:40
下面的单击事件,将要调用一个以对象为参数的方法,并将结果显示出来。
procedure TForm1.btn1Click(Sender: TObject);
var
lStrings: TStrings;
begin
lStrings:= TStringList.Create;
try
lStrings.Add('chen');
&nbs ......
(一) 使用动态创建的方法
首先创建 Excel 对象,使用ComObj:
var ExcelApp: Variant;
ExcelApp := CreateOleObject( 'Excel.Application' );
1) 显示当前窗口:
ExcelApp.Visible := True;
2) 更改 Excel 标题栏:
ExcelApp.Caption := '应用程序调用 Microsoft Excel';
3) 添加新工作簿:
ExcelApp.WorkBooks.Add ......