AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TaskDialogIndirect in einer 64bit Anwendung
Thema durchsuchen
Ansicht
Themen-Optionen

TaskDialogIndirect in einer 64bit Anwendung

Ein Thema von ringli · begonnen am 31. Dez 2013 · letzter Beitrag vom 5. Jan 2014
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#11

AW: TaskDialogIndirect in einer 64bit Anwendung

  Alt 5. Jan 2014, 17:13
Delphi-Quellcode:
begin
  CheckCommonControl( // oder IF not InitCommonControl(...) THEN Error...
             ICC_LISTVIEW_CLASSES or
             ICC_TREEVIEW_CLASSES or
             ICC_BAR_CLASSES or
             ICC_TAB_CLASSES or
             ICC_UPDOWN_CLASS or
             ICC_PROGRESS_CLASS or
             ICC_HOTKEY_CLASS or
             ICC_ANIMATE_CLASS or
             //ICC_WIN95_CLASSES or
             ICC_DATE_CLASSES or
             ICC_USEREX_CLASSES or
             ICC_COOL_CLASSES or
             ICC_INTERNET_CLASSES or
             ICC_PAGESCROLLER_CLASS or
             ICC_NATIVEFNTCTL_CLASS or
             ICC_STANDARD_CLASSES or
             ICC_LINK_CLASS
             ); // wobei natürlich nur die wirklich benötigten Klassen initialisiert werden wüssten

  tdiMessageDialog('Anwendungsname',
                   'Nachricht',
                   'Nachrichtentext',
                   '<a href="http://www.delphipraxis.net">Delphi-PRAXiS</a>',
                   '',
                   TD_ERROR_ICON,
                   nil,
                   TDCBF_OK_BUTTON,
                   '',
                   ID_OK,
                   TDF_EXPANDED_BY_DEFAULT,
                   0); //Handle
end.
so?

Es sei denn die VCL Läd/Initialisiert noch was Anderes, daß du ohne VCL ebenfalls noch machen musst. (hab da aber, an den wichtigsten Stellen, nichts gesehn)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Jan 2014 um 17:20 Uhr)
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: TaskDialogIndirect in einer 64bit Anwendung

  Alt 5. Jan 2014, 18:26
So nochmal eine kurze Rückmeldung:

Der Fehler saß jetzt tatsächlich vor dem Rechner. Ich weiß nicht warum, aber aus irgendwelchen Gründen waren die Laufzeithemes bei der 64bit-Version in den Projektoptionen verstellt. Nachdem ich alle Projektoptionen neu gesetzt habe, reicht tatsächlich der Aufruf von InitCommonControls; aus. Ein Aufruf con CheckCommonControl der ja auch wieder zur VCL gehört, ist somit nicht notwendig.

Danke nochmal an jaenicke und himitsu die sich die Mühe gemacht haben sich mit meinem Problem auseinanderzusetzen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#13

AW: TaskDialogIndirect in einer 64bit Anwendung

  Alt 5. Jan 2014, 18:27
Ein Aufruf con CheckCommonControl der ja auch wieder zur VCL gehört, ist somit nicht notwendig.
Dann solltest du aber auch den Rückgabewert der Funktion auswerten!
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: TaskDialogIndirect in einer 64bit Anwendung

  Alt 5. Jan 2014, 18:34
InitCommonControls hat keinen Rückgabewert, aber InitCommonControlsEx gibt einen Boolean zurück. Ich werde das wohl am besten noch umbauen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#15

AW: TaskDialogIndirect in einer 64bit Anwendung

  Alt 5. Jan 2014, 18:40
Nicht? (hatte da jetzt die API nicht angeguckt)

Dann will ich jetzt lieber nicht wissen, was InitCommonControl und CheckCommonControl macht.

Soweit ich gesehn hab, ruft CheckCommonControl das InitCommonControl auf.
Und InitCommonControl wendet sich dann an InitCommonControls und wenn das nicht geht (es False zurückgibt), an InitCommonControlsEx .... dachte ich zumindestens so gesehn zu haben.


[add]
Stimmt.

Aber das hättest du sowieso umstellen müssen.
Zitat von InitCommonControls:
Under Comctl32.dll version 6.0 and later, InitCommonControls does nothing. Applications must explicitly register all common controls through InitCommonControlsEx.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: TaskDialogIndirect in einer 64bit Anwendung

  Alt 5. Jan 2014, 18:45
Ich bin grade dabei, aber welchen ICC-Wert muß ich für die Taskdialoge verwenden?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#17

AW: TaskDialogIndirect in einer 64bit Anwendung

  Alt 5. Jan 2014, 18:55
Im Notfall kann mehr nicht schaden. Dauert theoretisch nur bissl länger, beim Laden/Initialisieren.

http://msdn.microsoft.com/en-us/libr.../bb775507.aspx
Es kommt wohl darauf an, was alles in dem Dialog verwendet wird.
Wenn ich mir die Liste so anseh, dann sieht es so aus, als wenn mindestens 50% der genannten Dinge nicht benötigt werden. (Animate, Cool, Data, Internet, ListView, Progress, TreeView, UpDown)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: TaskDialogIndirect in einer 64bit Anwendung

  Alt 5. Jan 2014, 19:06
Wenn ich das MSDN richtig verstehe, müsste InitCommonControlsEx True zurückgeben wenn es die Controls initialisieren konnte. Bei folgenden Code erscheint aber immer die Messagebox obwohl der Taskdialog danach angezeigt wird.
Delphi-Quellcode:
var
  ICC : TInitCommonControlsEx = (
    dwSize : SizeOf(TInitCommonControlsEx);
    dwICC :
      ICC_LISTVIEW_CLASSES or
      ICC_TREEVIEW_CLASSES or
      ICC_BAR_CLASSES or
      ICC_TAB_CLASSES or
      ICC_UPDOWN_CLASS or
      ICC_PROGRESS_CLASS or
      ICC_HOTKEY_CLASS or
      ICC_ANIMATE_CLASS or
      ICC_DATE_CLASSES or
      ICC_USEREX_CLASSES or
      ICC_COOL_CLASSES or
      ICC_INTERNET_CLASSES or
      ICC_PAGESCROLLER_CLASS or
      ICC_NATIVEFNTCTL_CLASS or
      ICC_STANDARD_CLASSES or
      ICC_LINK_CLASS
      );

begin
  if not InitCommonControlsEx(ICC) then
    begin
      MessageBox(0, 'InitCommonControlsEx!',
                    'Fehler',
                    MB_OK or MB_ICONSTOP);
      //Halt;
    end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#19

AW: TaskDialogIndirect in einer 64bit Anwendung

  Alt 5. Jan 2014, 19:38
Vermutlich wurden nicht Alle und vorallem eine der der anderen (von dir ungenutzen) Klasse nicht initialisiert?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
504 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: TaskDialogIndirect in einer 64bit Anwendung

  Alt 5. Jan 2014, 20:16
Scheinbar muß InitCommonControls trotzdem aufgerufen werden, sonst gibt InitCommonControlsEx immer False zurück obwohl der anschliessende Aufruf vom Taskdialog funktioniert.
Ich meine auch in den letzten Tagen bei der Lösungsrecherche etwas gelesen zu haben das es diesbezgl. mal einen Bug in der (Winapi.)CommCtrl.pas gegeben hat oder vielleicht sogar noch gibt.

Jedenfalls sieht der funktionierende Code jetzt so aus:
Delphi-Quellcode:
var
  ICC : TInitCommonControlsEx = (
    dwSize : SizeOf(TInitCommonControlsEx);
    dwICC : ICC_STANDARD_CLASSES);
.
.
.
  InitCommonControls;
  if not InitCommonControlsEx(ICC) then
    begin
      MessageBox(0, 'InitCommonControlsEx!',
                    'Fehler',
                    MB_OK or MB_ICONSTOP);
      Halt;
    end;
.
.
.
[EDIT]
Ich habe den Link wiedergefunden: http://www.entwickler-ecke.de/topic_...ug_5384,0.html

Allerdings habe ich jetzt nicht mehr nachgeprüft ob das immer noch so implementiert ist.

Geändert von ringli ( 5. Jan 2014 um 20:18 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 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