SHBrowseForFolder und merkwürdiges Problem



  • Hi,

    ich benutze in einem Projekt SHBrowseForFolder().

    Als ulFlags gebe ich BIF_RETURNFSANCESTORS|BIF_NEWDIALOGSTYLE an,
    alles funzt super.

    In einem anderen Projekt benutze ich den gleichen Code, dort
    geht das Verzeichnisauswahlfenster zwar auf, es fehlt aber
    das TreeView!! Habe ich so bisher noch nicht gesehen und bin
    nach absuchen der Einstellungen beider Projekte so ziemlich am Ende.

    Bei beiden Projekten gibt´s keine Linker- oder Compilerfehler.

    Weiß "zufällig" jemand von Euch, woran das liegen könnte?
    (Vielleicht habe ich doch etwas übersehen)

    Gruß,
    Colonius



  • Du machst das auch aus einem STA heraus, ja? Mit MTAs gibt das öfter mal Probleme.



  • -King- schrieb:

    Du machst das auch aus einem STA heraus, ja? Mit MTAs gibt das öfter mal Probleme.

    Hallo -King-

    ich denke mal ich bin kein absoluter Anfänger mehr, aber bei STA
    und MTA kann ich nur raten.

    STA = SingleThreadedApp, MTA = MultiThreadedApp ??????

    Also, wenn Du das meinst, BEIDE Anwendungen sind MTA ´s

    Noch eine klitzekleine Idee´vielleicht???? 😞

    Danke,
    Colonius



  • SingleThreadedApartment, MultiThreadedApartment meinte ich eigentlich. Ich wollte wissen, wie Du die COM-Runtimes initialisiert hast. Und wenn Du SHBrowseForFolder aus einem MTA heraus aufrufst (Initialisierung mit CoInitializeEx und COINIT_MULTITHREADED durchgeführt), dann geht es nicht. COM und GUI vertragen sich auschliesslich in STAs vernünftig.

    Abhilfe: Einen neuen Thread starten, in diesem ein STA initialisieren und von dort SHBrowseForFolder aufrufen. Zum Initialisieren kannst Du CoInitialize, CoInitializeEx mit COINIT_APARTMENTTHREADED oder OleInitialize verwenden.

    BTW: Den Main-(GUI-)Thread würde ich garantiert immer in einem STA wohnen lassen. Alles andere macht Dir früher oder später Kopfzerbrechen.



  • 😉

    Prima, genau das war es.

    Vielen Dank
    Colonius

    BTW wäre das nicht etwas für die FAQ?
    Wenn man den Trick nicht kennt, sucht man sich blöd...



  • Wer die Doku nicht liest, schaut auch nicht in die FAQs. 😃

    Im Ernst: Wenn Du Dir die Hilfe zu BROWSEINFO anschaust, speziell die Beschreibung des Flags BIF_NEWDIALOGSTYLE, steht da:

    MSDN schrieb:

    To use this flag, you must call OleInitialize or CoInitialize before calling SHBrowseForFolder.

    Selbst Schuld, wer dann noch COINIT_MULTITHREADED verwendet. 😉



  • -King- schrieb:

    Wer die Doku nicht liest, schaut auch nicht in die FAQs. 😃

    Im Ernst: Wenn Du Dir die Hilfe zu BROWSEINFO anschaust, speziell die Beschreibung des Flags BIF_NEWDIALOGSTYLE, steht da:

    MSDN schrieb:

    To use this flag, you must call OleInitialize or CoInitialize before calling SHBrowseForFolder.

    Selbst Schuld, wer dann noch COINIT_MULTITHREADED verwendet. 😉

    Ja, ja, hast ja Recht!
    Die MSDN spricht aber auch, man solle CoInitializeEx anstelle von
    CoInitialize verwenden.
    Das CoInitialize IMMER COINIT_APARTMENTTHREADED verwendet, habe ich in
    der Tat wirklich übersehen.

    Danke
    Colonius



  • es steht sogar noch genauer da:

    Note If COM is initialized using CoInitializeEx with the COINIT_MULTITHREADED flag, SHBrowseForFolder fails if the caller uses the BIF_USENEWUI or BIF_NEWDIALOGSTYLE flag in the BROWSEINFO structure.



  • . schrieb:

    es steht sogar noch genauer da:

    Note If COM is initialized using CoInitializeEx with the COINIT_MULTITHREADED flag, SHBrowseForFolder fails if the caller uses the BIF_USENEWUI or BIF_NEWDIALOGSTYLE flag in the BROWSEINFO structure.

    Jawollja, immer druff auf den leseschwachen Colonius!!
    👍


Anmelden zum Antworten