المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : حول Shell Integration


Ahmed18
10-04-2010, 01:15 PM
بسم الله الرحمن الرحيم

أ عمل Shell Integration مع برنامج فاحص ملفات بالدلفي وبعد عمل Procedure الخاص بتسجيل مسار البرنامج في الريجستر تواجهني مشكلة مع ايجاد مسار الملف المفحوص عند فتحة بواسطة برنامج الدلفي

فقد استخدمت هذة الأكواد مع ال MainForm.Create الرئيسية:


procedure TFormMain.FormCreate(Sender: TObject);
var
aFile_Cmd : String;
filename_Cmd : array[0..MAX_PATH] of char;
i,j : integer;
hInstance, cmdline : DWORD;

begin

hInstance := GetModuleHandle(nil);
GetModuleFileName(hInstance,@filename,512);
aFile := '"'+StrPas(Pchar(@filename))+'"'+' ';
aFile_Cmd := GetCommandLine();
if (aFile <> aFile_Cmd) then
begin
filename_Cmd := '';
i := 1;
j := 0;
aFile := '';
while (i <= Length(aFile_Cmd))do
begin
if (aFile_Cmd[i] <> '"') AND (aFile_Cmd[i] <> ' ') then
begin
filename_Cmd[j] := aFile_Cmd[i];
j := j+1;
end;
i := i +1;
end;
EdtPathName.Text:= Drag_Check_IfValidPE(aFile,filename_Cmd);

end;



المفترض الأن ان المتغير filename_Cmd سيحتوي علي مسار البرنامج المفحوص لكن الذي يحدث غير ذلك ويحدث خطأ مع الدالة CreateFile فيما بعد بسبب ان المسار غير سليم!!

فما هي الطريقة السليمة لعمل ذلك مع الدلفي ؟

kachwahed
10-04-2010, 04:25 PM
السلام عليكم ورحمة الله
تأكد أن الخلل ليس على مستوى Shell Integration
أيضا، تأكد من إضافة العلامة 1% إلى المفتاح Default في الـ Registry
ممكن توضح محتوى رسالة الخطأ؟
بالتوفيق.

Ahmed18
10-04-2010, 05:20 PM
وعليكم السلام..
لا انا متأكد من صحة ال Shell Integration
-
لا اقصد رسالة بل ناتج دالة ال createFile يكون Invalid Handle وهذا يحدث اذا كان مسار البرنامج وهو الباراميتر الأول للدالة خاطئ (يوجد اسباب اخري لكنها ليست سبب هذة المشكلة)
-
انا **** ان اعرف هل ناتج الدالة GetCommandLine يكون فعلا مسار الملف المفحوص !! لاني لست متأكد.

بعد ذلك اقارن بين مسار البرنامج نفسة ومسار الملف المفحوص فاذا تساوي فهذا يعني ان البرنامج يتم تشغيلة بشكل طبيعي وليس من قائمة ال Explorer Shell

B.M.AbdelAziZ
10-04-2010, 05:29 PM
السلام عليكم
استخدم ParamCount و ParamStr
راجع الHelp

Ahmed18
10-04-2010, 05:38 PM
خلاص وصلت الفكرة اخي عبد العزيز
بارك الله فيك

B.M.AbdelAziZ
10-04-2010, 05:46 PM
اي فكرة اخبرنا كي يستفيد غيرك :laugh:

بالمناسبة تحياتي لكل اعضاء الفريق العربي للهندسية العكسية وبانتظار الكتاب الثالث

Ahmed18
10-04-2010, 06:30 PM
بارك الله فيك اخي عبد العزيز.
-
واجهت مشكلة ال DOS Short File Names

C:\Users\Ahmed18\DOCUME~1\AT4REF~1\

المسار المختصر بهذا الشكل لا يمكن استخدامة مع CreateFile هل يوجد طريقة سهلة لحل ذلك ؟

kachwahed
10-04-2010, 07:54 PM
طبعا:
uses
SysUtils;

function GetLongFileName(ShortName: string): string;
var
Win32FindData: TWin32FindData;
SearchHandle: THandle;
Path: string;
begin
ZeroMemory(@Win32FindData, SizeOf(Win32FindData));
SearchHandle := FindFirstFile(PChar(ShortName), Win32FindData);
if SearchHandle <> INVALID_HANDLE_VALUE then
begin
Windows.FindClose(SearchHandle);
Path := ExtractFileDir(ShortName);
if Length(Path) > 3 then
begin
Path := GetLongFileName(Path);
Result := Path + '\' + Win32FindData.cFileName;
end
else
Result := Path + Win32FindData.cFileName;
end
else
Result := ShortName;
end;
بالتوفيق أخي أحمد.

mohfa
10-04-2010, 08:15 PM
يمكنك تحميل مشروعي FTG و مشاهدة كيفية القيام بذلك .
انظر الاجرائية :
procedure TForm1.StartScan(Param: String);
begin
// Directory
if DirectoryExists(IncludeTrailingPathDelimiter(Param )) then
begin
edit1.Text:=IncludeTrailingPathDelimiter(Param);
OnFtgDirScan(IncludeTrailingPathDelimiter(Param));
end;
// File
if FileExists(Param) then
begin
edit1.Text:=Param;
OnFtgFileScan(Param);
end;
end;

procedure TForm1.ShellOpsClick(Sender: TObject);
begin
ApplyShellExtension(Shell.Checked);
end;

و ApplyShellExtension في الوحدة Gft_u.pas :

procedure ApplyShellExtension(AEnable: boolean);

Ahmed18
10-04-2010, 08:27 PM
بارك الله فيكم اخواني
الان يعمل بشكل سليم

Ahmed18
12-04-2010, 01:25 AM
ملحوظة للاخوة الاعضاء
هناك خطأ بسيط في كود الاخ كاش واحد وهو:
Result := Path + + Win32FindData.cFileName;

يجب ان تكون:
Result := Path +'\' + Win32FindData.cFileName;

kachwahed
12-04-2010, 04:05 PM
هناك خطأ بسيط في كود الاخ كاش واحد وهو:
فعلا أخي أحمد شكرا للتنبيه، الخطأ في استخدام السمة php التي تسبب مثل هذه الأخطاء.
تم تغيير الوسم (code).