Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi UpdateLayeredWindow (https://www.delphipraxis.net/106249-updatelayeredwindow.html)

delphinia 7. Jan 2008 23:09


UpdateLayeredWindow
 
Ich nutze in einer Form

Delphi-Quellcode:
function UpdateLayeredWindow(hwnd: HWND; hdcDst: HDC; pptDst: PPoint; psize: PSize; hdcSrc: HDC; pptSrc: PPoint; crKey: TColor; pblend: PBlendFunction; dwFlags: DWORD): BOOL; stdcall; external 'user32.dll';



Wie kann ich nun bzw was muss ich tun damit wenn das Programm nun auf 98 ausgeführt wird diese Sache nicht beachtet wird und somit nicht zum Fehelr führt!

EWeiss 8. Jan 2008 00:29

Re: UpdateLayeredWindow
 
Zitat:

Zitat von delphinia
Ich nutze in einer Form

Delphi-Quellcode:
function UpdateLayeredWindow(hwnd: HWND; hdcDst: HDC; pptDst: PPoint; psize: PSize; hdcSrc: HDC; pptSrc: PPoint; crKey: TColor; pblend: PBlendFunction; dwFlags: DWORD): BOOL; stdcall; external 'user32.dll';



Wie kann ich nun bzw was muss ich tun damit wenn das Programm nun auf 98 ausgeführt wird diese Sache nicht beachtet wird und somit nicht zum Fehelr führt!

Windows version gegenprüfen

gruss Emil

Muetze1 8. Jan 2008 06:44

Re: UpdateLayeredWindow
 
Das Hauptproblem liegt aber hier: dynamisch einbinden und nicht statisch. Du bindest die Funktion nun statisch ein und somit kann die EXE von EXE Loader gar nicht erst gestartet werden unter 98, da er die imports nicht auflösen kann. Also schau dich mal bei LoadLibrary() etc um.

@EWeiss: kann er noch soviel reinschreiben, das würde gar nicht ausgeführt werden...

bitsetter 8. Jan 2008 07:57

Re: UpdateLayeredWindow
 
Getestet habe ich es nicht, aber so ähnlich müsste es gehen:
Delphi-Quellcode:
function UpdateLayeredWindow(wnd: HWND; hdcDst: HDC; pptDst: PPoint; psiz: PSize; hdcSrc: HDC; pptSrc: PPoint; crKey: TColor; pblend: PBlendFunction; dwFlags: DWORD): BOOL;
var
  hUser32: THandle;
  UpdateLayeredWnd: function(wnd: HWND; hdcDst: HDC; pptDst: PPoint; psiz: PSize; hdcSrc: HDC; pptSrc: PPoint; crKey: TColor; pblend: PBlendFunction; dwFlags: DWORD): BOOL; stdcall;
begin
  Result := false;
  hUser32 := LoadLibrary('user32.dll');
  if hUser32 <> 0 then
    try
      UpdateLayeredWnd:= GetProcAddress(hUser32, 'UpdateLayeredWindow');
      if Assigned(UpdateLayeredWnd) then
        result:= UpdateLayeredWnd(wnd, hdcDst, pptDst, psiz, hdcSrc, pptSrc, crKey, pblend, dwFlags);
    finally
      FreeLibrary(hUser32);
    end;
end;

EWeiss 8. Jan 2008 13:39

Re: UpdateLayeredWindow
 
Zitat:

Zitat von Muetze1
@EWeiss: kann er noch soviel reinschreiben, das würde gar nicht ausgeführt werden...

Deshalb ja meine Antwort ..
So wie ich weis steht diese API unter W98 nicht zur verfügung.
Um also einen Fehler zu vermeiden sollte er das Betriebssystem gegenprüfen und diese halt ausschalten wenn das system W98 ist.

oder hab ich das falsch verstanden?

gruss Emil

Muetze1 8. Jan 2008 14:01

Re: UpdateLayeredWindow
 
Und wo soll er den Code zum ermitteln der Windows Version hinschreiben wo doch seine EXE gar nicht erst von Windows geladen (somit auch nicht gestartet) wird?

EWeiss 8. Jan 2008 14:33

Re: UpdateLayeredWindow
 
Zitat:

Zitat von Muetze1
Und wo soll er den Code zum ermitteln der Windows Version hinschreiben wo doch seine EXE gar nicht erst von Windows geladen (somit auch nicht gestartet) wird?

Ach so dann gehts natürlich nicht.. habe das nicht herauslesen können das dies der fall ist.

gruss Emil

Muetze1 8. Jan 2008 14:45

Re: UpdateLayeredWindow
 
Zitat:

Zitat von EWeiss
Ach so dann gehts natürlich nicht.. habe das nicht herauslesen können das dies der fall ist.

Stand nicht explizit da, aber da er die Funktion statisch einbindet, wird das ganze vom Compiler in die IMPORTS Table der EXE geschrieben und die muss der EXE Loader von Windows auflösen und befüllen. Wenn der eine dort angegebene Funktion nicht gefunden wird, dann gibt es die schöne Meldung von Windows, dass das Programm nicht gestartet werden kann, da eine oder mehrere ihrer Komponenten nicht gefunden werden konnte.


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