//无论在本进程还是多个进程之间,你都可以使用这个单元:unit CopyData_San;interface uses windows,messages,sysutils;/////////////////////// procedure GetCopyDataParam(AMsg:TWMCopyData;var wParam:integer;var dwData:cardinal); function GetCopyData(AMsg:TWMCopyData):string;overload; procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);overload; /////////////////////////// function SendCopyData(AHandle:Cardinal;AStr:string;wParam:integer=0;dwData:cardinal=0):integer;overload; function SendCopyData(AHandle:Cardinal;P:pointer;Len:integer;wParam:integer=0;dwData:cardinal=0):integer;overload;implementation function SetData(p:pointer;len:integer;dwData:cardinal):TCopyDataStruct; begin result.cbData:=len; result.lpData:=p; result.dwData:=dwData;
end; function SendCopyData(AHandle:Cardinal;AStr:string;wParam:integer=0;dwData:cardinal=0):integer;overload; var len:integer; begin len:=length(astr); if len<=0 then exit; result:=sendcopydata(ahandle,@astr[1],len,wparam,dwdata);end;function SendCopyData(AHandle:Cardinal;P:pointer;Len:integer;wParam:integer=0;dwData:cardinal=0):integer;overload; var cs:tcopydatastruct; begin cs:=setdata(p,len,dwdata); result:=sendmessage(ahandle,wm_copydata,wparam,Cardinal(@cs));end; procedure GetCopyDataParam(AMsg:TWMCopyData;var wParam:integer;var dwData:cardinal); begin dwdata:=amsg.CopyDataStruct.dwData; wparam:=tmessage(amsg).WParam;end; procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer); begin p:=amsg.CopyDataStruct.lpData; len:=amsg.CopyDataStruct.cbData; end; function GetCopyData(AMsg:TWMCopyData):string; var i,len:integer; type pstr=array of char; begin result:=''; len:=amsg.CopyDataStruct.cbData; if len<=0 then exit; setlength(result,len); for i:=1 to len do begin result[i]:=pstr(amsg.CopyDataStruct.lpData)[i-1]; end; end;end.
(只能是同一个进程里面)
在同一个进程有效。
uses
windows,messages,sysutils;///////////////////////
procedure GetCopyDataParam(AMsg:TWMCopyData;var wParam:integer;var dwData:cardinal);
function GetCopyData(AMsg:TWMCopyData):string;overload;
procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);overload;
///////////////////////////
function SendCopyData(AHandle:Cardinal;AStr:string;wParam:integer=0;dwData:cardinal=0):integer;overload;
function SendCopyData(AHandle:Cardinal;P:pointer;Len:integer;wParam:integer=0;dwData:cardinal=0):integer;overload;implementation
function SetData(p:pointer;len:integer;dwData:cardinal):TCopyDataStruct;
begin
result.cbData:=len;
result.lpData:=p;
result.dwData:=dwData;
end;
function SendCopyData(AHandle:Cardinal;AStr:string;wParam:integer=0;dwData:cardinal=0):integer;overload;
var
len:integer;
begin len:=length(astr);
if len<=0 then exit; result:=sendcopydata(ahandle,@astr[1],len,wparam,dwdata);end;function SendCopyData(AHandle:Cardinal;P:pointer;Len:integer;wParam:integer=0;dwData:cardinal=0):integer;overload;
var
cs:tcopydatastruct;
begin
cs:=setdata(p,len,dwdata);
result:=sendmessage(ahandle,wm_copydata,wparam,Cardinal(@cs));end;
procedure GetCopyDataParam(AMsg:TWMCopyData;var wParam:integer;var dwData:cardinal);
begin
dwdata:=amsg.CopyDataStruct.dwData;
wparam:=tmessage(amsg).WParam;end;
procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);
begin
p:=amsg.CopyDataStruct.lpData;
len:=amsg.CopyDataStruct.cbData;
end;
function GetCopyData(AMsg:TWMCopyData):string;
var
i,len:integer;
type
pstr=array of char;
begin
result:='';
len:=amsg.CopyDataStruct.cbData;
if len<=0 then exit;
setlength(result,len);
for i:=1 to len do
begin
result[i]:=pstr(amsg.CopyDataStruct.lpData)[i-1];
end;
end;end.
发送的时候使用sendcopydata接受的时候,只要处理sm_copydata消息,并用getcopydata来处理这个twmcopydata消息。返回值就是你传递的string;不必担心string中有#0会丢失后面的数据。不会有这个问题。不但字符串可以,你还可以传递任何二进制信息。处理方法与上类似。