代码之家  ›  专栏  ›  技术社区  ›  Remus Rigo

在一个应用程序中打开文本文件

  •  1
  • Remus Rigo  · 技术社区  · 16 年前

    DPR看起来像这样

    uses
      Windows, Messages, SysUtils,
      Forms,
      wndMain in 'wndMain.pas' {frmMain};
    
    {$R *.res}
    
    var
      PrevWindow : HWND;
      S : string;
      CData : TCopyDataStruct;
    begin 
      PrevWindow := 0;
      if OpenMutex(MUTEX_ALL_ACCESS, False, 'MyMutex') <> 0 then
      begin
      repeat
         PrevWindow:=FindWindow('TfrmMain', nil);
      until PrevWindow<>Application.Handle;
    
         if IsWindow(PrevWindow) then
         begin
            SendMessage(PrevWindow, WM_SYSCOMMAND, SC_RESTORE, 0);
            BringWindowToTop(PrevWindow);
            SetForegroundWindow(PrevWindow);
    
            if FileExists(ParamStr(1)) then
            begin
               S:=ParamStr(1);
               CData.dwData:=0;
               CData.lpData:=PChar(S);
               CData.cbData:=1+Length(S);
    
               SendMessage(PrevWindow, WM_COPYDATA, 0, DWORD(@CData) );
               end;
            end;
         end
       else
          CreateMutex(nil, False, 'MyMutex');
    
      Application.Initialize;
      Application.CreateForm(TfrmMain, frmMain);
      Application.Run;
    end.
    

    考绩制度:

    type TfrmMain = class(TForm)
       memo: TMemo;
       private
          procedure WMCopyData ( var msg : TWMCopyData ) ; message WM_COPYDATA;
      public
         procedure OpenFile(f : String);
    end;
    
    var
      frmMain: TfrmMain;
    
    implementation
    
    {$R *.dfm}
    
    procedure TfrmMain.WMCopyData ( var msg : TWMCopyData ) ;
    var
       f : String;
    begin
       f:=PChar(msg.CopyDataStruct.lpData);
       //ShowMessage(f);
       OpenFile(f);
    end;
    
    procedure TfrmMain.OpenFile(f : String);
    begin
       memo.Clear;
       memo.Lines.LoadFromFile(f);
       Caption:=f;
    end;
    

    alt text http://img218.imageshack.us/img218/2175/errorjd.jpg

    谢谢

    2 回复  |  直到 16 年前
        1
  •  0
  •   Rob Kennedy    16 年前

    我怀疑您使用的是Delphi2009或Delphi2010。这些版本使用Unicode字符串,因此 Length 函数告诉 人物 但不是数字 . 这个 wm_CopyData SizeOf(WideChar) .

    CData.lpData := PWideChar(S);
    CData.cbData := (1+Length(S)) * SizeOf(WideChar);
    
        2
  •  1
  •   Mason Wheeler    16 年前

    length sizeof(char)