如果sendmessage可以,那么参数不是int么?怎么实现传送字符串?

解决方案 »

  1.   

    使用自定义的消息WM_OPENFILE=WM_USER+10;WinMain()
    {
      if(如果已经运行)
      {
         SendMessage(PreHandle,WM_OPENFILE,0,(LPARAM)ParamStr(1).c_str());
         return;
       }
       //正常启动
       //...
    }
    -----------
    在程序中响应WM_OPENFILEvoid __fastcall WMOpenFile(TMessage& Message);BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(WM_OPENFILE,TMessage,WMOpenFile);
    END_MESSAGE_MAP(TForm);-------
    void __fastcall TForm1::WMOpenFile(TMessage& Message)
    {
      AnsiString FileName=AnsiString((char*)Message.LParam);
      //打开文件
      //....
    }
      

  2.   

    以下是delphi源代码:可以收到,但是为什么是乱码?
    unit main1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        commsg:cardinal;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      self.commsg:=registerwindowmessage('aaa');
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    hd:thandle;
    p:pchar;
    begin
    p:='test';
    hd:=findwindow(nil,'Form2');postmessage(hd,commsg,0,lparam(p));
    end;end.
      

  3.   

    unit main2;interfaceuses
      Windows,AppEvnts, Classes, Messages, SysUtils,forms;type
      TForm1 = class(TForm)
        ApplicationEvents1: TApplicationEvents;
        procedure FormCreate(Sender: TObject);
        procedure ApplicationEvents1Message(var Msg: tagMSG;
          var Handled: Boolean);
      private
        { Private declarations }
      public
        { Public declarations }
        commsg:cardinal;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      commsg:=registerwindowmessage('aaa');
    end;procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    begin
    if msg.message=self.commsg then
    begin
      showmessage(pchar(msg.lParam));
    end;
    end;end.
      

  4.   

    程序main1往程序main2发消息,
    能收到,但是为什么main2受到以后先是的乱码?////////////////////////////////////////我觉得main1发送的p的地址,是一个integer类型的数而已,而main2收到的lparam是相对于自己虚拟内存区的地址,当然读到的不一定是什么乱七八糟的东西啦。/////////////////////////
    还有没有知道的了?
      

  5.   

    不好意思,以前我的一个程序使用过这样的功能,但我传递的是HWND变量而不是字符串,那再使用WM_COPYDATA消息试一下:下面是使用WM_COPYDATA消息的代码:发送(Main2) :  COPYDATASTRUCT cds;  AnsiString Data=ParamStr(1);
      cds.dwData=sizeof(COPYDATASTRUCT);
      cds.cbData=Data.Length();
      cds.lpData=(LPVOID)Data.c_str();  //想目标窗口发消息WM_COPYDATA
      SendMessage(PreHandle,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);接收(Main1): //Override WndProc Method if(Message.Msg==WM_COPYDATA)
     {
        COPYDATASTRUCT *cds;
        char* DataBuf;    cds=(COPYDATASTRUCT*)Message.LParam;
        DataBuf=new char[cds->cbData];
        CopyMemory(DataBuf,cds->lpData,cds->cbData);    AnsiString Str=AnsiString(DataBuf);
        Memo1->Lines->Add("FileName="+Str);    delete[] DataBuf;
     }
      

  6.   

    发送短:
    procedure TForm1.Button1Click(Sender: TObject);
    var d: COPYDATASTRUCT;
      P: PChar;
      AHandle: HWnd;
    begin
      P := 'LXP';
      d.dwData := SizeOf(COPYDATASTRUCT);
      d.cbData := Length(P);
      d.lpData := P;
      AHandle := FindWindow(nil,'AS');
      SendMessage(AHandle,WM_COPYDATA,0,LPARAM(@d));
    end;接受短:
    procedure SysCommand(var msg:TWMCOPYDATA);message WM_COPYDATA;
    procedure TForm1.SysCommand(var msg:TWMCOPYDATA);
    var S: String;
    begin
      S := PChar(msg.CopyDataStruct.lpData);
      SetLength(S,msg.CopyDataStruct.cbData);
      ShowMessage(S);
    end;
    —————————————————————————————————
    MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
                 毁誉由人,望天上云卷云舒,聚散任风。';
    if Not Assigned(I) then
      I := TI.Create(Nil);
    I.Maxim := MaximStr;
    I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
    I.Desire := '加不加分随你';
    —————————————————————————————————
      

  7.   

    http://www.csdn.net/Expert/TopicView1.asp?id=745961
      

  8.   

    利用WM_COPYDATA消息 
     使用该消息涉及一个TcopyDataStruct结构类型的指针。该结构中有三个成员:dwData 是一个32位的附加参数cbData 表示要传递的数据区的大小lpData 表示要传递的数据区的指针下面举个例子。该例子由两个程序构成,分别为SendData和GetData。SendData程序向GetData程序发送消息,并传递edit1中的字符串;GetData在收到消息后,把SendData发送的字符串接受下来,并显示在相应的edit1中。SendData程序: 
    ……varForm1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: Tobject);vards: TCopyDataStruct;hd: Thandle;beginds.cbData := Length (Edit1.Text) + 1;GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存StrCopy (ds.lpData, Pchar (Edit1.Text));Hd := FindWindow (nil, 'Form2'); // 获得接受窗口的句柄if Hd <> 0 thenSendMessage (Hd, WM_COPYDATA, Handle,Cardinal(@ds)) // 发送WM_COPYDATA消息elseShowMessage ('目标窗口没找到!');FreeMem (ds.lpData); //释放资源end;GetData程序: 
     TForm2 = class(Tform)Edit1: Tedit;private{ Private declarations }publicprocedure Mymessage(var t:TWmCopyData);message WM_COPYDATA;{ Public declarations }end;varForm2: TForm2;implementationprocedure TForm2.Mymessage(var t:TWmCopyData);beginEdit1.text:=StrPas(t.CopyDataStruct^.lpData);//接受数据并显示。end;使用这种方法是WIN32应用程序进行交互的最简单的方法。使用全局原子 
    Win32系统中,为了实现信息共享,系统维护了一张全局原子表。每个原子中存放了一些共享数据。关于对原子的操作,有一组专门的API函数:GlobalAddAtom 在表中增加全局原子GlobalDeleteAtom 在表中删除全局原子GlobalFindAtom 在表中搜索全局原子GlobalGetAtomName 从表中获取全局原子笔者用这种方法实现了避免程序二次启动,但把第二次启动所带的参数传到第一个实例中以进行相应的处理的程序。基本处理如下:在工程文件中:program Pvdde;usesForms,shellapi,Windows,dialogs,dde in 'dde.pas' {Form1};{$R *.RES}beginif GlobalFindAtom(Pchar('PDDE_IS_RUNNING')) = 0 then//避免二次启动beginK:=GlobalAddAtom(Pchar('PDDE_IS_RUNNING'));Application.Initialize;Application.CreateForm(TForm1, Form1);Application.Run;endelsebegin//传递二次启动时的参数到第一个实例H := FindWindow(Pchar('TForm1'), Pchar('资料保密 严禁外传'));if ParamCount > 0 thenbeginL := GlobalAddAtom(Pchar(ParamStr(1)));if H<>0 thenSendMessage(H, WM_MYMESSAGE, 0, L);{ 传递原子句柄 }GlobalDeleteAtom(L); { 使用后释放 }end;Application.Terminate;end;end.在相应的窗口单元dde.pas增加对自定义消息WM_MYMESSAGE的处理:procedure TForm1.MyMessage(var T:Tmessage);{对 WM_MYMESSAGE消息进行处理 }varP:Array [0..255] of char;beginGlobalGetAtomName(T.Lparam, P,255); { 接受数据到p数组中 }end;使用存储映象文件 
     这种方法相对较复杂一些。当Win95与Winows Nt向内存中装载文件时,使用了特殊的全局内存区。在该区域内,应用程序的虚拟内存地址和文件中的相应位置一一对应。由于所有进程共享了一个用于存储映象文件的全局内存区域,因而当两个进程装载相同模块(应用程序或DLL文件)时,它们实际可以在内存中共享其执行代码。笔者通过调用一个带有特殊参数的CreateFileMapping函数,来间接达到程序间共享内存的目的。下面简要解释一下该函数。HANDLE CreateFileMapping(HANDLE hFile, //文件句柄LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 可选安全属性DWORD flProtect, // 映象文件保护方式DWORD dwMaximumSizeHigh, // 映象文件区域的底值DWORD dwMaximumSizeLow, // 映象文件区域的顶值LPCTSTR lpName // 映象文件的名字);如果hFile是0xFFFFFFFF,在调用程序中必须指定dwMaximumSizeHigh 和dwMaximumSizeLow参数的值以确定映象文件的大小。通过这样的参数指定,该函数就创建了一个由操作系统页文件支持的特殊逻辑映象文件,而不是由实际操作系统的文件支持的逻辑映象文件。这个逻辑映象文件可以通过复制、继承或者按名字来达到共享。至于其它参数的详细说明,请参看在线帮助。在建立了映象文件之后,我们可以通过调用另外一个API函数MapViewOfFile来访问它的内存,该函数会返回一个指向共享内存块的特定指针。LPVOID MapViewOfFile(HANDLE hFileMappingObject, // 映象文件句柄DWORD dwDesiredAccess, // 访问方式DWORD dwFileOffsetHigh, // 映象文件区域的底值DWORD dwFileOffsetLow, // 映象文件区域的顶值DWORD dwNumberOfBytesToMap // 映射字节数);如果 dwNumberOfBytesToMap 是0,映射整个文件。以下举例说明:privatehMapFile: Thandle;MapFilePointer: Pointer;public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: Tobject);beginhMapFile := CreateFileMapping ($FFFFFFFF, // 特殊内存映射句柄nil, page_ReadWrite, 0,10000,'DdhDemoMappedFile'); // 文件名if hMapFile <> 0 thenMapFilePointer := MapViewOfFile (hMapFile, // 上面映象文件的句柄File_Map_All_Access,0, 0, 0) // 访问整个映象文件elseShowMessage ('hMapFile = 0');if MapFilePointer = nil thenShowMessage ('MapFilePointer = nil');end; procedure TForm1.BtnWriteClick(Sender: Tobject);beginStrCopy (Pchar (MapFilePointer),Pchar (EditWrite.Text));//把内容写入共享内存end; procedure TForm1.BtnReadClick(Sender: Tobject);varS: string;beginS := Pchar (MapFilePointer);//从共享内存读出内容EditRead.Text := S;end;