请大家看看我的这段代码有什么错!(100分)

  • 主题发起人 主题发起人 pink_wt
  • 开始时间 开始时间
P

pink_wt

Unregistered / Unconfirmed
GUEST, unregistred user!
我是想让我的程序只运行一次,当程序第二次运行时把参数传递给第一个,为什么这段程序
不能正常运行,请大家帮忙看看。

主程序:
program renamefiles;
uses
Forms,
windows,
messages,
SysUtils,
main in 'main.pas' {MainForm},

{$R *.res}
var
hwd:hwnd;
Hd:integer;
ds:COPYDATASTRUCT;
begin

Application.Initialize;

Application.Title := 'xxx';
hwd:=createmutex(nil,false,'xxx');
if GetLastError<>Error_Already_Exists then
begin
Application.CreateForm(TMainForm, MainForm);
Application.Run;
releasemutex(hwd);
end
else
begin
Hd:=FindWindow('TMainForm',nil);
SetForegroundWindow(Hd);
if paramcount>0 then
begin
ds.cbData:=Length(paramstr(1))+1;
GetMem(ds.lpData,ds.cbData);
strCopy(ds.lpData,PChar(paramstr(1)));
application.MessageBox(pchar(paramstr(1)),'information',0);
SendMessage(hd,WM_COPYDATA,Application.handle,Cardinal(@ds));

FreeMem(ds.lpData);
end;

end;
end.



unit main;
。。。

private
procedure ReveiveData1(var Msg:TWmCopyData); message WM_COPYDATA;

var
MainForm: TMainForm;


procedure TMainForm.ReveiveData1(var Msg:TWmCopyData);
begin
showmessage(string(Msg.CopyDataStruct^.lpData));
//自定义函数
AddFromMenu(string(Msg.CopyDataStruct^.lpData));
end;
 
我看挺正常的,两个messagebox都显示了些什么?
 
第一个显示完全正常,第二个则有是显示有时不显示
 
奇怪,我用的很正常
和你程序的区别就在我直接把ParamStr(1)的串指针赋给lpData,没开辟新的缓冲区
应该说这些方法是没什么区别的
难道是程序之外的东西?
 
我这可就不这样了,如果在资源管理器中选择一个文件点右键时,程序完全正常,但同时选多个时,
问题就来了,就会出现“invalid pointer operation"的错误,然后就是冲突.其实这是第二个
showmessage(string(Msg.CopyDataStruct^.lpData));显示的数据也是正常的.添加一个和多个
文件后的处理函数都是AddFromMenu;此函数没有问题.
 
WM_COPYDATA本身是不会引起非法指针错误的,
我觉得你应该检查一下发送端在多选时的处理,
是不是哪个指针提前释放了?
 
程序的其余部分没有错误,只是在加入了这几句后才出现的错误
 
多人接受答案了。
 
后退
顶部