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 nonVCL Fenster erstellen-> fensterklasse wurde nicht gefuden (https://www.delphipraxis.net/123549-nonvcl-fenster-erstellen-fensterklasse-wurde-nicht-gefuden.html)

Viktorii 4. Nov 2008 10:15


nonVCL Fenster erstellen-> fensterklasse wurde nicht gefu
 
Hallo zusammen.

Ich möchte ein nonVCL Fenster erstellen. Dazu habe ich mich hier und bei google durchgesucht und folgenden Code erstellt:

Delphi-Quellcode:
procedure ShownonVCLWindow();
var
  FHandle : Cardinal;

begin
  with nonVCLWindow do
  begin
    cbSize := SizeOf(TWndClassEx);
    style := CS_VREDRAW or CS_VREDRAW;
    lpfnWndProc := @DefWindowProc;
    hIcon := LoadIcon(0, IDI_WINLOGO);
    lpszClassName := 'myClass';
  end;

  if RegisterClassEx(nonVCLWindow) = 0 then
    MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Error', MB_ICONSTOP or MB_OK);

  FHandle := CreateWindowEx(0,nonVCLWindow.lpszClassName,'myWindow',
                            WS_VISIBLE, 100,100,50,50,0,0,hInstance,nil);

  if FHandle = 0 then
    MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Error', MB_ICONSTOP or MB_OK);
end;
Allderings erzeugt CreateWindowEx den Fehler "Fensterklasse wurde nicht gefunden"?
Was mache ich flasch?
Vielen Dank

Andi1985 4. Nov 2008 10:49

Re: nonVCL Fenster erstellen-> fensterklasse wurde nicht
 
du hast das
Delphi-Quellcode:
FillChar(nonVCLWindow, SizeOf(TWndClassEx), 0);
vergessen.
Dann funktioniert deine procedure bei mir!

turboPASCAL 4. Nov 2008 10:51

Re: nonVCL Fenster erstellen-> fensterklasse wurde nicht
 
Delphi-Quellcode:
procedure ShownonVCLWindow();
var
  FHandle : Cardinal;

begin
  ZeroMemory(@nonVCLWindow, sizeof(TWndClassEx)); // <--<<
  with nonVCLWindow do
  begin
    cbSize := SizeOf(TWndClassEx);
    style := CS_VREDRAW or CS_VREDRAW;
    lpfnWndProc := @DefWindowProc;
    hIcon := LoadIcon(0, IDI_WINLOGO);
    lpszClassName := 'myClass';
  end;

  if RegisterClassEx(nonVCLWindow) = 0 then
    MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Error', MB_ICONSTOP or MB_OK);

  FHandle := CreateWindowEx(0,nonVCLWindow.lpszClassName,'myWindow',
                            WS_VISIBLE, 100,100,50,50,0,0,hInstance,nil);

  if FHandle = 0 then
    MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Error', MB_ICONSTOP or MB_OK);
end;
Füge bitte mal diese Zeile hinzu. Der Grund kann sein das die restlichen Felder
von nonVCLWindow ungültiges enthalten.

Andi1985 4. Nov 2008 10:52

Re: nonVCL Fenster erstellen-> fensterklasse wurde nicht
 
oder so^^ ;)

Viktorii 4. Nov 2008 11:11

Re: nonVCL Fenster erstellen-> fensterklasse wurde nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank für Eure Antworten erstmal.

Leider klappen beide Varianten bei mir nicht :(

Habe mal ein Screenshot mit den Werten des Records angehängt.

Wer weiss Rat?

Andi1985 4. Nov 2008 12:03

Re: nonVCL Fenster erstellen-> fensterklasse wurde nicht
 
Zitat:

Zitat von Viktorii
Vielen Dank für Eure Antworten erstmal.

Leider klappen beide Varianten bei mir nicht :(

Habe mal ein Screenshot mit den Werten des Records angehängt.

Wer weiss Rat?

Ich hab dein Quellcode 1 zu 1 kopiert in mein BDS 2006 Projekt.
Die Werte bei mir sind die selben "(48, 1, $4052E4, 0, 0, 4194304, 65551, 0, 0, nil, 'myClass', 0)". (Auser die Pointer natürlich)
und bei mir läuft es...

welche IDE benutzt du?
welche Headers ? (ich hab nur Windows und sysutils)
welches OS ?

ansonsten wüst ich auch nicht mehr woran es liegen könnte...

Viktorii 4. Nov 2008 12:33

Re: nonVCL Fenster erstellen-> fensterklasse wurde nicht
 
Okay, eins habe ich natürlich vergessen zu erwähnen :oops: Die Funktion ist in einer Dll und wird testweise im begin end Block aufgerufen...

In einer normalen Formanwendung funktioniert es bei mir auch, habe ich gerade gesehen...

Wieso in der Dll nicht?

Der Vollständigkeit halber:
WinXP SP3
Delphi 2009

Viktorii 6. Nov 2008 09:40

Re: nonVCL Fenster erstellen-> fensterklasse wurde nicht
 
*push*

Viktorii 6. Nov 2008 14:11

Re: nonVCL Fenster erstellen-> fensterklasse wurde nicht
 
Okay ich hab's:

Man muss nach dem with-do block noch

Delphi-Quellcode:
  nonVCLWindow.hInstance := HInstance;
einfügen.

So ganz verstehe ich aber nicht was da passiert. Wenn ich genau auf die Zeile einen Breakpoint mache, haben beide Variablen den Wert 0. Springe ich eine Anweisung weiter, hat nonVCLWindow.hInstance den Wert 3407872 {$340000}, HInstance hat aber immer noch 0. :shock:

Was passiert da? Wie kann das? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz