Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi unti shellobj und WM_ message (https://www.delphipraxis.net/79737-unti-shellobj-und-wm_-message.html)

Rociel 27. Okt 2006 10:15


unti shellobj und WM_ message
 
hi, ich hab folgfendes problem, ich will eine WM_ message einbinden (WM_CLOSE), habe aber eine prozedur, die die unit shellobj benötigt, nun sagt delphi aber immer, die deklaration der message-proc sei nicht richtig geforwarded....

wenn ich die shellobj nicht mit einbinde läuft aber alles mit den messages....

kennt einer ne lösung, bei der ich beides nutzen kann?

turboPASCAL 27. Okt 2006 11:07

Re: unti shellobj und WM_ message
 
Was gebräuchlich ist:

Delphi-Quellcode:
uses
  Windows, Messages, ShellAPI
Die Unit "ShellObj" kenn ich jetzt nicht (denk ich mal :gruebel: ). Es wäre Sinnvoll wenn du noch sagst um welche Function/Procedur es sich handelt.

// Edit:

Achso, du meinst wohl die Unit "ShlObj". ?

SirThornberry 27. Okt 2006 11:24

Re: unti shellobj und WM_ message
 
ob eine Procedure richtig geforwardet wird hängt nicht davon ab welche Units eingebunden sind.

turboPASCAL 27. Okt 2006 11:35

Re: unti shellobj und WM_ message
 
Stimmt.

Aber ohne genauere Infos kann man schlecht etwas sagen. :mrgreen:

Rociel 27. Okt 2006 13:35

Re: unti shellobj und WM_ message
 
stimmt, die heißt ShlObj wird benötigt von:

Delphi-Quellcode:
function GetSpecialFolder(hWindow: HWND; Folder: Integer): String;
var
  pMalloc: IMalloc;
  pidl: PItemIDList;
  Path: PChar;
begin
  // get IMalloc interface pointer
  if (SHGetMalloc(pMalloc) <> S_OK) then
  begin
    MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.',
               'SHGetMalloc(pMalloc)', 16);
    Exit;
  end;

  // retrieve path
  SHGetSpecialFolderLocation(hWindow, Folder, pidl);
  GetMem(Path, MAX_PATH);
  SHGetPathFromIDList(pidl, Path);
  Result := Path;
  FreeMem(Path);

  // free memory allocated by SHGetSpecialFolderLocation
  pMalloc.Free(pidl);
end;
so, wenn ich die nicht einbinde, dann läuft alle ok, wenn se aber eingebunden ist, dann bringt er bei

Delphi-Quellcode:
procedure WMclose(var Msg:TMessage);message WM_CLOSE;
die meldung: [Fehler] main.pas(70): E2065 Ungenügende Forward- oder External-Deklaration: 'Tshutdown_061025.WMclose'

turboPASCAL 27. Okt 2006 13:45

Re: unti shellobj und WM_ message
 
Dann setze doch mal die Procedure WMClose() ein paar zeilen weiter oben in deinem Code oder
stelle mit

Delphi-Quellcode:
program Project1;

procedure GetTest(param: char); forward; // <--<<<

procedure BevoreTest;
begin
  GetTest(#0);
end;

procedure GetTest(param: char);
begin
end;

begin
  //...
end.
vorran.

Arbeitest du mit der VCL / OOP ?

Rociel 27. Okt 2006 13:57

Re: unti shellobj und WM_ message
 
also das forward geht irgendwie nicht.....

der code sieht so aus, und geht nich, hab die procedur schon so weit wie möglich nach oben gesetzt:

Delphi-Quellcode:
      procedure WMclose(var Msg:TMessage);message WM_CLOSE;
    procedure Abmelden1Click(Sender: TObject);
    procedure Ruhezustand1Click(Sender: TObject);
    procedure Standby1Click(Sender: TObject);
    procedure Neustart1Click(Sender: TObject);
    procedure Herunterfahren1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Prozessbeenden1Click(Sender: TObject);
    procedure Computersperren1Click(Sender: TObject);
    procedure Abmelden3Click(Sender: TObject);
    procedure Neustart3Click(Sender: TObject);
    procedure Herunterfahren3Click(Sender: TObject);
    procedure Abmelden2Click(Sender: TObject);
    procedure Neustart2Click(Sender: TObject);
    procedure Herunterfahren2Click(Sender: TObject);
    procedure Ruhezustand3Click(Sender: TObject);
    procedure Standby3Click(Sender: TObject);
    procedure Standby2Click(Sender: TObject);
    procedure PopupMenu1Popup(Sender: TObject);
    procedure Ruhezustand2Click(Sender: TObject);
    procedure Einstellungen1Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure TrayDblClick(Sender: TObject);
    procedure showtimer(art : tdown);
  private
    closable : boolean;
  public
        procedure shutdown(typ : Tdown);


  end;

var
  shutdown_061025: Tshutdown_061025;

implementation

  uses hib, ShlObj;

{$R *.dfm}

function SetSuspendState(Hibernate,ForceCritical,DisableWakeEvent:boolean):boolean;stdcall;
external 'powrprof.dll';
function IsPwrSuspendAllowed():boolean;stdcall;
external 'powrprof.dll';
function IsPwrHibernateAllowed():boolean;stdcall;
external 'powrprof.dll';
function LockWorkStation():boolean;stdcall;
external 'User32.dll';

procedure WMclose(var Msg:TMessage);
begin
Showmessage('ok');
end;
ich arbeite mit VCL

wenn ich da n forward stehen hab, passt dann da noch n "message WM_CLOSE" hin?

turboPASCAL 27. Okt 2006 14:00

Re: unti shellobj und WM_ message
 
Na dann...

Ggf. Fehlt ja nur ein TForm1.WMClose... etc.

Rociel 27. Okt 2006 14:03

Re: unti shellobj und WM_ message
 
:wall: ja ok, die woche war lang=)

is nur die frage, warum es trotzdem geht, wenn die unit nicht eingebunden ist

SirThornberry 27. Okt 2006 14:07

Re: unti shellobj und WM_ message
 
es wird dann vermutlich klappen weil die entsprechende Forwarddeclaration wo anders vorhanden ist etc. bzw. durch einen Namenskonflikt durch die ShlObj alles nicht mehr klappt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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