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也不行。那要怎么做才行啊。????

解决方案 »

  1.   

    可能是string是自动动态控制的缘故
      

  2.   

    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。
      

  3.   

    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;
      

  4.   

    PhotoName : string;改为PhotoName : ansistring;
      

  5.   

    原因是楼主的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'.
      

  6.   

    1、因为是用 sendmessage 所以不会“当string的引用计数为零自动释放内存空间后,PChar很可能指向一个无效的内存地址”;
    2、如僵哥解释的,可以用sendmessageW unicode版本试看看
      

  7.   

    抱歉,第2點搞糊涂了。可以用sendmessageW unicode版本试看看