pchar(),pwidechar(),pansichar()都不行啊。

haochin 2010-04-12 07:27:44

procedure TCamera_F.btn1Click(Sender: TObject);
var
PhotoName : string;
begin
PhotoName := 'D:\JETT\1.BMP'
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_SAVEDIB, 0, LongInt(PAnsiChar(PhotoName)));
end;
end;


上面程序的结果在程序的目录下生成了一个名为 'D'的文件。
显然不是想要的结果

但是如果后面一句写成
SendMessage(hWndC, WM_CAP_SAVEDIB, 0, LongInt(PAnsiChar('D:\JETT\1.BMP')));

就可以正常将图像保存到指字文件中。

我想回该是sendMessage的最后一个参数出了问题,
PAnsiChar()好像不行。
Pchar也不行
Pwidechar也不行。

那要怎么做才行啊。????
...全文
253 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2010-04-13
  • 打赏
  • 举报
回复
原因是楼主的Delphi编译器当中的string为unicode,而“目标”只支持ANSI码,因此Unicode的'D:\JETT\1.BMP'按照ANSI码理解(不是转换)则为'D'#0'\'#0'J'#0...'B'#0'M'#0'P'#0#0,因此目标只能取到'D'#0就结束了。得到的字符串当然也就只是'D'.
僵哥 2010-04-13
  • 打赏
  • 举报
回复
PhotoName : string;改为PhotoName : ansistring;
金卯刀 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 avan_lau 的回复:]

1、因为是用 sendmessage 所以不会“当string的引用计数为零自动释放内存空间后,PChar很可能指向一个无效的内存地址”;
2、如僵哥解释的,可以用sendmessageW unicode版本试看看
[/Quote]
抱歉,第2點搞糊涂了。可以用sendmessageW unicode版本试看看
haochin 2010-04-13
  • 打赏
  • 举报
回复
惊动了这么多的高手,真是不好意思啊。。。。

我试试。
金卯刀 2010-04-13
  • 打赏
  • 举报
回复
1、因为是用 sendmessage 所以不会“当string的引用计数为零自动释放内存空间后,PChar很可能指向一个无效的内存地址”;
2、如僵哥解释的,可以用sendmessageW unicode版本试看看
ysai 2010-04-12
  • 打赏
  • 举报
回复
procedure TCamera_F.btn1Click(Sender: TObject);
var
PhotoName : array[0..MAXBYTE-1] of char;
begin
PhotoName := 'D:\JETT\1.BMP';
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_SAVEDIB, 0, LongInt(@PhotoName[0]));
end;
end;
gyk120 2010-04-12
  • 打赏
  • 举报
回复


1. string是Delphi编译器内在支持的(predefined or built-in),是Delphi的一个基本数据类型,而PChar只是一个指向零终止字符串的指针;
2. String 所存字符串是在堆分配内存的,String变量实际上是指向零终止字符串的指针,与此同时它还具有引用计数(reference count)功能,并且自身保存字符串长度,当引用计数为零时,自动释放所占用的空间。
3.将string赋值给另一个string,只是一个简单的指针赋值,不产生copy动作,只是增加string的引用计数;
4.将一个PChar变量类型赋值给一个string 变量类型会产生真正的Copy动作,即将PChar所指向的字符串整个copy到为string分配的内存中;
5.将string赋值给一个PChar变量类型,只是简单地将string的指针值赋值给PChar变量类型,而string的引用计数并不因此操作而发生变化,因为这种情况PChar会对string产生依赖,当string的引用计数为零自动释放内存空间后,PChar很可能指向一个无效的内存地址,在你的程序你必须小心对付这种情况。
6.对PChar的操作速度要远远高于对string操作的速度,但PChar是一种落后的管理字符串的方式,而string则以高效的管理而胜出,PChar它的存在只是为了兼容早期的类型和操作系统(调用Windows API时会经常用到),建议平常使用string。
阿发伯 2010-04-12
  • 打赏
  • 举报
回复
可能是string是自动动态控制的缘故

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧