Entwickler-Ecke

Windows API - Messagebox wird nicht angezeigt ohne Form Units


Biarchiv - Di 25.08.09 15:06
Titel: Messagebox wird nicht angezeigt ohne Form Units
Hallo,

blöde Frage. Diese Messagebox wird nicht angezeigt wenn ich ein project ohne form erstelle. Wo ich halt nur in der dpr programmiere ohne richtiges projekt. Das komische im Win2000 gehts aber nicht im WinXP. Es kommt zwar der Messagebox-Beep aber nicht die Messagebox selbst.

Lösungen?


Delphi-Quelltext
1:
messagebox(0'TEST''TEST', MB_OK);                    

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Hallo,

mir ist jetzt folgendes aufgefallen.
Wenn ich in meinem Delphi 2006 Prof ein Manifest mit XP-Style und Vista Rights (requireAdministrator) mitkompiliere ist das so. Sonst nicht.


Yogu - Di 25.08.09 15:56

Hm, vielleicht benötigt MessageBox ein Formular, keine Ahnung.

Wenn du nur einen einfachen Dialog anzeigen willst, könntest du ShowMessage verwenden.

Sonst kannst du Application.MessageBox verwenden, wobei du dafür natürlich die Unit Forms einbinden musst, und Application.Initialize; ganz am Anfang aufrufen musst. Formulare braucht man für die Methode nicht, das hab ich schon ausprobiert.


jaenicke - Di 25.08.09 16:09

Und das ist ein normales Programm, also kein Dienst oder so etwas? Ein Konsolenprogramm vielleicht? Ich werde das in einer VM gleich mal kurz testen.


turboPASCAL - Di 25.08.09 19:02

Jao, so 'n paar mehr Infos zum Programmaufbau und wie die Messagebox aufgerufen wird wären nicht schlecht.
Zb. läuft die App als Fullscreen etc. pp. ...

Eigentlich Funktioniert die Messagebox immer, bzw. kann es vorkommen das sie nicht sichtbar also von anderen
Fenstern verdeckt wird da es bei einem Aufruf wie beschrieben als "Desktopchildwindow" erzeugt wird.


jaenicke - Di 25.08.09 19:24

Auf jeden Fall kann ich das nicht reproduzieren, egal bei was für einem Programm, es funktioniert auch unter XP. :nixweiss:

Bei einem Dienst z.B. würde das natürlich anders aussehen, da würde die Meldung natürlich nicht erscheinen.


Biarchiv - Mi 26.08.09 14:13

Hallo,

nein läuft nicht als Konsole.

Ich hab mal ein sehr kurzes Beispiel-Source mit test.exe hinzugefügt.

Test.dpr und die WinVista.RES. Die test.exe zeigt in WinXP keine messagebox allerdings kommt der Gong. In Win2000 kommt die Box normal. Benutzt mit Delphi2006 Prof und alles Updates sowie Hotfixes.

Wenn man die Resourcen nicht einbindet läuft es.

Vorschläge?


Delete - Mi 26.08.09 22:01

Was ist das für eine Ressource?


Delete - Mi 26.08.09 22:48

Dein Code

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
uses sysutils, ShellAPI, windows;

{$R winvista.RES}

begin
  messagebox(0'test''Test', MB_OK);
end.

Ohne die Ressource funktioniert es. Mit Ressource wird die MessageBox nicht angezeigt.

Füge ich nach der Messagebox ein Readln ein, bekomme ich eine Exception. Da stimmt was nicht mit der Ressource.

Getestet unter XP SP2 und BDS2006.


Biarchiv - Do 27.08.09 15:52

Hallo,

das komische ist wenn ich bei der uses einfach dialogs hinzufüge, dann funktioniert es mit der selben Resource. Wie kann das sein. Was hat die Forms mit der messagebox API zu tun?



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
uses sysutils, ShellAPI, windows, dialogs;

{$R winvista.RES}

begin
      messagebox(0'test''Test', MB_OK);
end.


Delete - Do 27.08.09 18:45

Ich vermute, dass durch die Ressource auf ungültigen Speicher zugegriffen wird. Bindest du jetzt die Unit Dialogs ein sieht dein Speicher anderes aus und es klappt zufällig.

Aber was ist denn das jetzt für eine Ressource? Ist da ein Manifest drine? Ist das Manifest eventuell fehlerhaft?


Biarchiv - Do 27.08.09 18:57

Hallo,

die res file hab ich hochgeladen.

Sie sieht so aus:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 


<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"


<assemblyIdentity 
    name="SoftwareName" 
    processorArchitecture="*" 
    version="1.0.0.0" 
    type="win32"/> 


<description>Windows Shell</description


<dependency
    <dependentAssembly
        <assemblyIdentity 
            type="win32" 
            name="Microsoft.Windows.Common-Controls" 
            version="6.0.0.0" 
            processorArchitecture="x86" 
            publicKeyToken="6595b64144ccf1df" 
            language="*" 
        /> 
    </dependentAssembly
</dependency




  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"
    <security
      <requestedPrivileges
        <requestedExecutionLevel 
          level="requireAdministrator"/> 
      </requestedPrivileges
    </security
  </trustInfo>


Moderiert von user profile iconNarses: Code- durch XML-Tags ersetzt


jaenicke - Do 27.08.09 21:58

Naja, das ist auch ungültiges XML... Da fehlt der schließende Tag:

XML-Daten
1:
2:
  ...
</assembly>


Delete - Do 27.08.09 22:02

user profile iconBiarchiv hat folgendes geschrieben Zum zitierten Posting springen:
die res file hab ich hochgeladen.

Damit kann man nichts anfangen, weil es ein kompiliertes Ressourcenskript ist.

Zitat:

Sie sieht so aus:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 


<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"


<assemblyIdentity 
    name="SoftwareName" 
    processorArchitecture="*" 
    version="1.0.0.0" 
    type="win32"/> 


<description>Windows Shell</description


<dependency
    <dependentAssembly
        <assemblyIdentity 
            type="win32" 
            name="Microsoft.Windows.Common-Controls" 
            version="6.0.0.0" 
            processorArchitecture="x86" 
            publicKeyToken="6595b64144ccf1df" 
            language="*" 
        /> 
    </dependentAssembly
</dependency




  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"
    <security
      <requestedPrivileges
        <requestedExecutionLevel 
          level="requireAdministrator"/> 
      </requestedPrivileges
    </security
  </trustInfo>


Also ein Manifest.

Welche Ressourcen ID hat das Manifest? Manifeste müssen in der Ressource eine bestimmte ID haben, damit sie von Windows automatisch gefunden werden. Zeig uns noch mal dein unkompiliertes Ressourcenskript.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Naja, das ist auch ungültiges XML... Da fehlt der schließende Tag:

XML-Daten
1:
2:
  ...
</assembly>

Aha. Sage ich doch, dass die Ressource bzw. das enthaltene Manifest fehlerhaft ist.


Biarchiv - Fr 28.08.09 17:27

Hallo,

leider ist mir mit copy and paste ein Fehler passiert. Der


Delphi-Quelltext
1:
</assembly>                    

Tag ist doch am Ende in der Resource. Also scheint die Resource keinen Fehler zu haben. Kann das jemand bestedigen?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 


<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 


<assemblyIdentity 
    name="MyProgram" 
    processorArchitecture="*" 
    version="1.0.0.0
    type="win32"/> 


<description>Windows Shell</description> 


<dependency> 
    <dependentAssembly> 
        <assemblyIdentity 
            type="win32" 
            name="Microsoft.Windows.Common-Controls" 
            version="6.0.0.0
            processorArchitecture="x86" 
            publicKeyToken="6595b64144ccf1df" 
            language="*" 
        /> 
    </dependentAssembly> 
</dependency> 




  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
      <requestedPrivileges> 
        <requestedExecutionLevel 
          level="requireAdministrator"/> 
      </requestedPrivileges> 
    </security> 
  </trustInfo> 


</assembly>


hinzufügen.

Hat das neue Delphi2010 eine fehlerfreie Manifest-Kombo für XP-Style und Zugriffrechte?

Man kann die Res Datei mit einem Resourcenprogramm wie ResHacker öffnen.


Biarchiv - Mo 31.08.09 15:05

Hi,

geht der Code richtig mit dem aktuellen Delphi (ohne dialogs unit)?

Sonst würde ja beim D2006 diese Funktion (und/oder mehr) nicht mit dem Vista/7 Manifest kompatible sein, oder?