Namen der COM-Befehle von MS Word



  • Sir_Tobias schrieb:

    TEXT("b&bVisible")
    

    Du willst aber *viele* Parameter übergeben! Lies nochmals die Doku zu "Invoke" 😉



  • @Jochen:

    Vielen Dank für den Tip, also werden nur die Typen übergeben und nicht die Namen. Also so dann:

    OLESTR("Visible"), TEXT("b"), vVisible))
    

    Was für mich noch nicht ganz klar ist:

    Aus der Type-Lib will ich z.B. die Funktion

    HRESULT OpenOld(
                    [in] VARIANT* FileName, 
                    [in, optional] VARIANT* ConfirmConversions, 
                    [in, optional] VARIANT* ReadOnly, 
                    [in, optional] VARIANT* AddToRecentFiles, 
                    [in, optional] VARIANT* PasswordDocument, 
                    [in, optional] VARIANT* PasswordTemplate, 
                    [in, optional] VARIANT* Revert, 
                    [in, optional] VARIANT* WritePasswordDocument, 
                    [in, optional] VARIANT* WritePasswordTemplate, 
                    [in, optional] VARIANT* Format, 
                    [out, retval] Document** prop);
    

    verwenden.

    1. Wie kann ich die optionalen Parameter auslassen oder müssen immer alle belegt sein?
    2. Wenn ich den Rückgabewert, also die Properties des Dokuments speichern möchte, welcher Datentyp ist da zu verwenden. Document** geht ja schlecht?!

    Gruß,

    Tobias



  • Sir_Tobias schrieb:

    1. Wie kann ich die optionalen Parameter auslassen oder müssen immer alle belegt sein?

    Bist Du Dir sicher, dass die Parameter jeweils ein "VARIANT*" (mit Stern!) sind? Ich hätte jetzt alle ohne Stern vermutet.
    Optionale-Parameter übergibt man in einem Variant mit dem Typ "VT_ERROR" und dem Code "DISP_E_PARAMNOTFOUND".
    Also z.B: so:

    VARIANT m;  // Missing parameter
    VariantInit(&m);
    V_VT(&m) = VT_ERROR;
    V_ERROR(&missing) = DISP_E_PARAMNOTFOUND;
    Invoke(m_pdispWord, DISPATCH_METHOD, NULL, NULL, NULL, 
      OLESTR("OpenOld"), 
      TEXT("vvvvvvvvvv&D"), 
      vFileName, 
      m, m, m, m, m, m, m, m, m,
      &pDoc,
      NULL)
    VariantClear(&m);
    

    Hab es aber nicht wirklich probiert...

    Sir_Tobias schrieb:

    2. Wenn ich den Rückgabewert, also die Properties des Dokuments speichern möchte, welcher Datentyp ist da zu verwenden. Document** geht ja schlecht?!

    IDispatch



  • Hallo,

    vielen Dank für die Tips. Welchen Unterschied macht es eigentlich, den VARIANT-Typ als Safe-Array ("v") oder gleich den enthaltenden Typ mit anzugeben ("seeee")?

    Wenn der Aufruf nicht klappt, gibt es laut MSDN die Möglichkeit, sich eine Fehlermeldung ausgeben zu lassen, die ich ja folgendermaßen aufrufen kann:

    EXCEPINFO getExcepInfo;
    if ((FAILED(Invoke(m_pdispWord, DISPATCH_METHOD, &returnVal, &getExcepInfo, NULL, OLESTR("OpenOld"), TEXT("vvvvvvvvvv&D"), 
    vFileName, vError, vError, vError, vError, vError, vError, vError, vError, vError, &pDoc))) {
    BSTR bstr_Fehler = getExcepInfo.bstrSource;
    

    Wie kann man diese Fehlermeldung sinnvoll ausgeben lassen?

    Gruß,

    Tobias


  • Mod

    Sir_Tobias schrieb:

    vielen Dank für die Tips. Welchen Unterschied macht es eigentlich, den VARIANT-Typ als Safe-Array ("v") oder gleich den enthaltenden Typ mit anzugeben ("seeee")?

    Weil es die Schnittstelle so beschriebt. Bitte lies doch mal die Doku wie Jochen es Dir gesagt hat.
    Das Problem ist nämlich: Machst Du es richtig funktioniert es, machst Du es falsch geht es nicht! 😉



  • Hallo,

    vielen Dank für die ausführliche Hilfe, habe es soweit hinbekommen:

    Eine kleine Frage hätte ich allerdings noch:

    Ich möchte gerne Konstanten aus der Typelib statt reine Zahlen verwenden, um möglichst die Kompatibilität zwischen den Office-Versionen zu wahren. Z.B. diese hier:

    typedef enum {
        wdFindStop = 0,
        wdFindContinue = 1,
        wdFindAsk = 2
    } WdFindWrap;
    

    Wie greife ich darauf zu? Geht das überhaupt mit Invoke(...)?

    Vielen Dank schon mal.

    Gruß,

    Tobias


  • Mod

    Das hat nichts mit Invoke zu tun, sondern dem importieren der TypeLib. Du benötigst die entsprechende Header Datei. Hier werden keine symbolischen Namen übergeben sondenr Zahlen!



  • Hallo,

    vielen Dank für den Hinweis. Aber wenn ich die Typelib (z.B. msword.olb) direkt importiere, klappt es doch mit anderen Office-Versionen nicht mehr, oder?

    Gruß,

    Tobias


  • Mod

    Sir_Tobias schrieb:

    vielen Dank für den Hinweis. Aber wenn ich die Typelib (z.B. msword.olb) direkt importiere, klappt es doch mit anderen Office-Versionen nicht mehr, oder?

    Wieso? Du verwendest doch die Wrapper und DispIDS nicht. Du verwendest doch nur die enum's.



  • Importiere doch die TLB _einmal_ und kopiere dir die "versteckten" Dateien und nimm daraus dann die enums 😉


Anmelden zum Antworten