如何写一个如Winzip一般的程序来接受在Explorer中右键选取“Add With MySoft”的一组文件名?(300分)

  • 主题发起人 主题发起人 章慧
  • 开始时间 开始时间

章慧

Unregistered / Unconfirmed
GUEST, unregistred user!
需要范例,急,300分
 
對註冊表進行操作
 
Shell/open With/command/!#$%^&.exe?
哪会启动程序n遍的!
如有人回答我,再加200分
 
改注册表可以,
但最正统的办法是用Shell API
 
怎么改?
除非使用DDE吧,接受参数的方法行不通的,请给源码
 
不用DDE只能接受一個參數,要啓動程序n遍才能接收到n個消息,不行吧
 
delphi5/delphi6自带的范例,好像是这个路径
Delphi6.0/Demos/ActiveX/ShellExt
 
告诉我你的email,我发给你。
 
算了,还是贴这儿吧。
program Project1;

uses
; Forms, Windows, Messages, SysUtils,
; Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
; mhandle: THandle;
; CDS: TCopyDataStruct;
; Fn: PChar;

begin
; Application.Initialize;

; Fn := PChar(ParamStr(1));
; FillChar(CDS, SizeOf(TCopyDataStruct), #0);
; CDS.cbData := StrLen(Fn) + 1;
; CDS.lpData := Fn;

; mhandle := FindWindow(nil, 'Send_Param_Test');
; if mhandle <> 0 then
; ; begin
; ; ; SendMessage(mhandle, WM_COPYDATA, 0, LParam(@CDS));
; ; ; Halt;
; ; end;

; Application.CreateForm(TForm1, Form1);
; Application.Run;
end.

; public
; ; { Public declarations }
; ; procedure GetParam(var msg: TWMCopyData); message WM_COPYDATA;
; end;

procedure TForm1.GetParam(var msg: TWMCopyData);
var
; Fn:string;
begin
; Fn:=string(PChar(msg.CopyDataStruct^.lpData));
; if Fn <> '' then Memo1.Lines.Add(Fn);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
; Fn: string;
begin
; Fn := ParamStr(1);
; if Fn <> '' then Memo1.Lines.Add(Fn);
; Edit1.Text:=IntToStr(form1.Handle);
end;

窗体caption命名为了Send_Param_Test。
注意close all之后再运行程序。
还有问题的话,给我发email:yuan-fan@21cn.com
 
謝謝,我調試一下對了馬上給分,2天之内
 
不對吧,Explorer好像沒有用WM_CopyData向我送信息。
你的意思把受到的信息發給前一個實例?我幾個月前就是這樣寫的了。
這樣會死掉,當在Explorer里選中數個或者假設10000個文件,右鍵選取Add with
一定會完蛋的。
請再給實例,無效的程序不能給分
 
unit Unit1;

interface

uses
; Windows, Messages, SysUtils, Classes, Graphics,s_reg, Controls, Forms, Dialogs,
; StdCtrls, Buttons, ComCtrls, ExtCtrls, Unit7;

type




; TForm1 = class(TForm)
; ; Panel1: TPanel;
; ; OpenDialog1: TOpenDialog;
; ; OpenDialog2: TOpenDialog;
; ; Animate1: TAnimate;
; ; Frame71: TFrame7;
; ; procedure SpeedButton1Click(Sender: TObject);
; ; procedure SpeedButton2Click(Sender: TObject);
; ; procedure Button1Click(Sender: TObject);
; ; //procedure Button2Click(Sender: TObject);
; ; procedure FormCreate(Sender: TObject);
; ; //procedure Button3Click(Sender: TObject);
; private
; ; { Private declarations }
; public
; ; { Public declarations }
; end;
; function RestoreFile(SourceFileName, TargetFileName: string ): Longint;
var
; Form1: TForm1;

implementation

uses Unit2, Unit3, Unit4;

{$R *.DFM}


function RestoreFile(SourceFileName, TargetFileName: string ): Longint;
var
; SourceFile, TargetFile: TFileStream;

begin
; SourceFile := nil;
; TargetFile := nil;
; try
; ; SourceFile := TFileStream.Create(SourceFileName, fmOpenRead + fmShareDenyNone);
; ; if SourceFile = nil then
; ; begin
; ; ; //文件打不开
; ; ; Result := -1;
; ; ; Exit;
; ; end;

; ; TargetFile := TFileStream.Create(TargetFileName, fmOpenReadWrite + fmShareExclusive);
; ; if TargetFile = nil then
; ; begin
; ; ; //文件创建失败
; ; ; SourceFile.Free;
; ; ; Result := -2;
; ; ; Exit;
; ; end;


; ; ; SourceFile.Position := 0;
; ; ; TargetFile.Position:=TargetFile.Size;
; ; ; TargetFile.CopyFrom(SourceFile, sourcefile.size);



; ; SourceFile.Free;
; ; TargetFile.Free;
; except
; ; if SourceFile <> nil then SourceFile.Free;
; ; if TargetFile <> nil then TargetFile.Free;

; end;
; result :=1;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
; //if self.OpenDialog1.Execute then edit1.Text :=opendialog1.FileName;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
; //if self.OpenDialog2.Execute then edit2.Text :=opendialog2.FileName;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
; //RestoreFile(edit2.text, edit1.text )
end;



procedure TForm1.FormCreate(Sender: TObject);
var
; filepath:string;
begin
; filepath:=application.ExeName;
; Setregstring(HKEY_CLASSES_ROOT,'*/shell/filecut' ,'','文件分割机');
; Setregstring(HKEY_CLASSES_ROOT,'*/shell/filecut/command' ,'',filepath);
; form2:=Tform2.Create (nil);
; form3:=Tform3.Create (nil);
; form3.ClientHeight:=0;
; form2.Parent :=panel1;
; //form2.Align :=alLeft;
; form2.top:=0;
; form2.Left :=0;
; form2.Height:=panel1.Height-form3.Height;
; form2.Show;

; form3.Parent :=panel1;
; //form2.Align :=alLeft;
;
; //form3.Height:=self.ClientHeight-form2.Height;
; form3.top:=form2.Height;
; form3.Left :=0;
; //form2.ClientHeight:=0;
; form3.Show ;
end;



end.
 
你的要求好高哇,按你的要求应该要写shell扩展吧?我可不会。
一般的会有人在explore中同时开10000个文件吗?如果是那样的话,
有几个程序可以让系统不死机呢?
 
To antic_ant:
; ;看不出來您的這段程序和我所提出的問題有何種聯係,請指教。
To 遠帆:
; ;當然不會啊,Explorer不過是通過某種操作傳回10000個參數而已,假設文件名有
100個字,也才1M而已呀,
To All:
; ;斑竹在那裏?有人能解決嗎?我的項目被這個問題卡住了,再解決不了,整個體系
要重新規劃了,決不食言,誰解決了,我給1000分,程序範例!
 
我想不是分的问题,先学习一下。
 
首先,你通过什么实现 Mouse shell context menu?
1. 如果只是在HKEY_CLASSES_ROOT/*/shell下面添加的注册表处理是比较麻烦的,当然不是
说不可以,你可以通过Mutex保证你的程序实例只有一个,新进程通过WM_COPYDATA传递参数
信息,就是 远帆 写的代码那样做的一样,不过这样做效果并不好。

2. 如果可能的话,尽可能通过IShellExtInit,IContextMenu实现Mouse Context Menu的扩展,
这样就可以通过DragQueryFile将参数列表都读出来。如果你需要代码,论坛上面应该有很多的,
到全文搜索里面找 "IContextMenu" 吧。

找到一个例子:
http://www.csdn.net/develop/read_article.asp?id=3544
 
還是沒怎麽看懂,不過調對了就好,請問如何加上小圖標?
 
http://www.csdn.net/develop/read_article.asp?id=3544
 
To Dragon PC
; 請幫忙解決我的其他兩個問題,仍然是關於仿造WinZip和PC-cillin功能的,
在“系統相關”里,不食言,只是我不知道怎麽給出1000分,還有750分從那些里給吧
 
后退
顶部