![]() |
Re: Registry, Dateien mit Programm verknüpfen
Da muß ich dich leider enttäuschen, Mathias.
Es ist zwar möglich aber nich schnell genug. Für die einfache Variante: Wenn du dem Programm 1000 Parameter übergeben möchtest, heißt das für den Explorer: Starte 1000 mal das Programm. Du hast dann nur eine Anwendung offen, aber das ständige Starten drückt auf die Zeit. DLL-Variante: Der Explorer übergibt alle Dateinamen an eine Shell-DLL weiter, von der DLL aus, sendest du alle Paramter an deine Hauptanwendung. Das heißt 1x Starten und viel viel Zeit sparen. Deswegen benutzen auch Packer eine Shell-Erweiterung. :zwinker: |
Re: Registry, Dateien mit Programm verknüpfen
Zitat:
Aber enttäuscht wg. der Thematik? Nee, ich weiß ja auch nicht alles. Viel, manchmal mehr als mir lieb ist, aber eben nicht alles ... ;) |
Re: Registry, Dateien mit Programm verknüpfen
Das liegt sicherlich auch daran, dass man im Netz nicht soviel darüber findet.
(Shellerweiterung) Und schon gar nicht in Object Pascal. |
Re: Registry, Dateien mit Programm verknüpfen
Das habe ich bisher.
irgendwie will der code aber nicht so richtig, kann sich den mal jemand ansehen? Danke schonmal
Delphi-Quellcode:
unit main;
interface uses ComServ, SysUtils, ShellAPI, Registry, Classes, Windows, ActiveX, ComObj, ShlObj, Graphics, Dialogs; const GUID_Tnp2cont: TGUID = '{44FC978E-C20B-42D2-A6BD-DD3968D43172}'; type Tnp2cont = class(TComObject, IShellExtInit, IContextMenu) protected function IShellExtInit.Initialize = SEInitialize; function SEInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject; hKeyProgID: HKEY): HResult; stdcall; function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast, uflags: UINT): HResult; stdcall; function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall; function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT; pszName: LPSTR; cchMax: UINT): HResult; stdcall; end; implementation var FFileName: array[0..MAX_PATH] of Char; hBmp: TBitmap; type Tnp2contFactory = class(TComObjectFactory) public procedure UpdateRegistry(Register: boolean); override; end; function Tnp2cont.SEInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject; hKeyProgID: HKEY): HResult; var StgMedium: TStgMedium; FormatEtc: TFormatEtc; begin if (lpdobj = nil) then begin Result := E_INVALIDARG; Exit; end; with FormatEtc do begin cfFormat := CF_HDROP; ptd := nil; dwAspect := DVASPECT_CONTENT; lindex := -1; tymed := TYMED_HGLOBAL; end; Result := lpdobj.GetData(FormatEtc, StgMedium); if Failed(Result) then Exit; if (DragQueryFile(StgMedium.hGlobal, $FFFFFFFF, nil, 0) = 1) then begin DragQueryFile(StgMedium.hGlobal, 0, FFileName, SizeOf(FFileName)); Result := NOERROR; end else begin FFileName[0] := #0; Result := E_FAIL; end; ReleaseStgMedium(StgMedium); end; function Tnp2cont.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast, uFlags: UINT): HResult; begin Result := 0; if ((uFlags and $0000000F) = CMF_NORMAL) or ((uFlags and CMF_EXPLORE) <> 0) then begin InsertMenu(Menu, indexMenu, MF_STRING or MF_BYPOSITION, idCmdFirst, 'Mit NotePad2 bearbeiten'); Result := 1; end; end; function Tnp2cont.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; resourcestring sPathError = 'Error setting current directory'; var H: THandle; PrevDir: string; begin Result := E_FAIL; if (HiWord(Integer(lpici.lpVerb)) <> 0) then begin Exit; end; if (LoWord(lpici.lpVerb) <> 0) then begin Result := E_INVALIDARG; Exit; end; PrevDir := GetCurrentDir; try if not SetCurrentDir(ExtractFilePath(FFileName)) then raise Exception.CreateRes(@sPathError); H := WinExec(PChar(Format(extractfilepath(paramstr(0))+'notepad2.exe', [FFileName])), lpici.nShow); if (H < 32) then MessageBox(lpici.hWnd, 'NotePad2 konnte nicht gestartet werden.', 'Error', MB_ICONERROR or MB_OK); Result := NOERROR; finally SetCurrentDir(PrevDir); end; end; function Tnp2cont.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT; pszName: LPSTR; cchMax: UINT): HResult; begin if (idCmd = 0) then begin if (uType = GCS_HELPTEXT) then // return help string for menu item StrCopy(pszName, 'Diese Datei mit NotePad2 bearbeiten.'); Result := NOERROR; end else Result := E_INVALIDARG; end; procedure Tnp2contfactory.UpdateRegistry(Register: Boolean); var ClassID: string; begin if Register then begin inherited UpdateRegistry(Register); ClassID := GUIDToString(GUID_Tnp2cont); CreateRegKey('*\shellex', '', ''); CreateRegKey('*\shellex\ContextMenuHandlers', '', ''); CreateRegKey('*\shellex\ContextMenuHandlers\DFKontextMenu', '', ClassID); if (Win32Platform = VER_PLATFORM_WIN32_NT) then with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions', True); OpenKey('Approved', True); WriteString(ClassID, 'NP2'); finally Free; end; end else begin DeleteRegKey('*\shellex\ContextMenuHandlers\DFKontextMenu'); DeleteRegKey('*\shellex\ContextMenuHandlers'); DeleteRegKey('*\shellex'); inherited UpdateRegistry(Register); end; end; initialization // hier wird die Erweiterung registriert Tnp2contFactory.Create(ComServer, Tnp2cont, GUID_Tnp2cont, '', 'NotePad2', ciMultiInstance, tmApartment); hBmp := TBitmap.Create; // Bild aus Ressourcendatei laden (der Name der Bildressource muss als 2. Parameter angegeben // werden - auf keinen Fall den DefaultNamen belassen, den der Bildeditor vergibt! hBmp.LoadFromResourceName(hInstance, 'NOTEPAD2'); finalization // Bitmap wieder freigeben hBmp.Free; end. |
Re: Registry, Dateien mit Programm verknüpfen
Es wäre gut, wenn du "deinen" Quellcode besser auskommentieren würdest.
PS: Was funktioniert denn nicht genau. |
Re: Registry, Dateien mit Programm verknüpfen
Alles scheint zu funzen bis auf Invokecommand(Wird ausgeführt wenn das Item angeklickt wird) Da sollte dann mein Prog mit Params. starten
Sry wegen der Commentierung. Gruß, Max |
Re: Registry, Dateien mit Programm verknüpfen
Du mußt dir jetzt irgendwie den Programmpfad deines Editors holen.
Ich speichere den Programmpfad in der Registry. Außerdem mußt du nun feststellen, ob dein Programm bereits läuft. Wenn es läuft sendest du eine Nachricht mit allen Parametern an dein Programm. Ansonsten mußt du eben dein Programm starten und solange warten, bis es gestartet ist. Und anschließend senden..... |
Re: Registry, Dateien mit Programm verknüpfen
Das Programm wird ja gestartet. Der Pfad sollte auch korrekt sein und die Parameter werden ebenfalls übergeben aber es funktioniert nicht. Nichts wird gestartet.
|
Re: Registry, Dateien mit Programm verknüpfen
Zitat:
Wird es gestartet oder nicht? |
Re: Registry, Dateien mit Programm verknüpfen
Achso sorry,
Ich wollte sagen die DLL wird richtig abgearbeitet bis zum Punkt wo das Programm starten soll. Naja die Parameter sollte richtig sein und der Pfad auch aber das Programm wird nicht gestartet und die vorgefertigte Fehlermeldungwird ausgegeben. Gruß, max |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz