Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#1

Probleme der Win32-API-Tutorials 1.9.1 (CHM)

  Alt 14. Apr 2004, 09:38
Hallo.

Luckie hat ja gestern nun die neue Version der Tutorials auf deinen Server geworfen, und da wollte ich a) Werbung und b) auf kleine Problemchen aufmerksam machen. Ich habe nämlich (quasi auf den letzten Drücker) die Hilfedateien komplett getestet, speziell was die PSDK-Links angeht. Und dabei sind mir ein paar Dinge aufgefallen:
  1. Unter Windows 98 kann es passieren, dass das Inhaltsverzeichnis des PSDK leer ist wenn man einen der Links aus der CHM-Hilfedatei aufruft. (Oder der Index.) Unter Windows XP konnte ich das nicht nachvollziehen. Evtl. ist es also ein Betriebssystem-abhängiges Problem, oder es liegt am Document Explorer, der in meinem Fall unter Windows 98 eine ältere Version zu sein scheint (PSDK Februar 2003).
    Unter XP habe ich zwar die gleiche PSDK-Version, aber wg. Delphi 8 installierte ich vorher noch das .NET-Framework 1.1 samt SDK. Meine Vermutung ist, dass der Document Explorer daher aktueller ist. Das würde z.B. erklären, warum die Funktion "SyncIndex" unter 98 einen Skriptfehler verursacht, während sie unter XP läuft.
  2. Wie ich im "Willkommen" der Hilfedatei schon schrieb kann es beim Aufruf eines Links zu einer Warnung wg. eines nicht sicheren ActiveX-Controls kommen. Das Problem liegt aber nicht bei mir sondern bei Microsoft. Die haben das entsprechende Modul nicht signiert bzw. anderweitig als für Scripting sicher gekennzeichnet. Oder sie wollten das absichtlich nicht. Keine Ahnung.
    Ich hatte ursprünglich mal eine andere Version des Skriptes, das bereits beim Laden der Seite versucht hat, den Document Explorer anzusprechen. Wenn das nicht geklappt hätte, wären die jeweiligen Schlüsselworte in der Seite gar nicht erst als Links dargestellt worden. Allerdings war diese Warnung dann doch etwa nervig, eben weil sie gleich beim Aufruf der Seite erschien. Daher der Kompromiss: sofern JavaScript aktiv ist, werden die Links dargestellt; die Warnung oder Fehlermeldung erscheint aber erst wenn man drauf klickt.

    Hier der originale Skriptcode (auch damit ihr seht, dass da tatsächlich nichts Schlimmes passiert):
    Code:
    <!--

    var DExplore = null;

    if(document.documentElement) {

      // get all elements with name/id "psdk"
      var psdk = document.getElementsByName("psdk");
      if(psdk && psdk.length > 0) {
        var a = null;
        var txt = null;
        var title = null;

        for(var i=0;i<psdk.length;i++) {
          if(psdk[i].nodeName == "SPAN" &&
            psdk[i].firstChild &&
            psdk[i].firstChild.nodeName != "A" &&
            psdk[i].firstChild.nodeValue != "")
          {
            title = psdk[i].getAttribute("title");
            if(title && title!="") psdk[i].removeAttribute("title");

            a = document.createElement("A");
            txt = document.createTextNode(psdk[i].firstChild.nodeValue);

            if(a && txt) {
              a.appendChild(txt);
              a.setAttribute("title","Thema im PSDK ansehen");

              if(title && title!="")
                a.setAttribute("href","javascript:performPSDK('" +
                title + "');");
              else
                a.setAttribute("href","javascript:performPSDK('" +
                psdk[i].firstChild.nodeValue + "');");

              a.setAttribute("className","PSDK");
              psdk[i].replaceChild(a,psdk[i].firstChild);
            }
          }
        }

        title = null;
        txt = null;
        a = null;
      }
    }


    var SyncIndex = false;
    var IndexResults = false;


    function performPSDK(keyword) {
      if(DExplore == null) {
        try {
          DExplore = new ActiveXObject("DExplore.AppObj.7");
        } catch(e) {
          DExplore = null;
        }

        if(DExplore) {
          DExplore.setCollection("ms-help://MS.PSDK.1033","");

          try {
            DExplore.SyncIndex("bool",1);
            SyncIndex = true;
          } catch(e) {
            SyncIndex = false;
          }

          try {
            DExplore.IndexResults();
            IndexResults = true;
          } catch(e) {
            IndexResults = false;
          }   
        }
      }

      if(DExplore) {
        DExplore.DisplayTopicFromF1Keyword(keyword);
        if(SyncIndex) DExplore.SyncIndex(keyword,1);
        if(IndexResults) DExplore.IndexResults();
      } else {
        alert("Der Document Explorer von Microsoft ist nicht installiert.");
      }
    }


    function FreeMem() {
      if(DExplore) DExplore = null;
    }

    window.onunload = FreeMem;

    //-->
    Es gilt das, was im "Willkommen" steht: für modifizierte Versionen, die Schaden anrichten, übernehme ich keine Haftung.

    Als Beispiel:
    Code:
    <span id="psdk" name="psdk">CreateWindow</span>
    <span id="psdk" name="psdk" title="WNDCLASSEX">TWndClassEx</span>
    Im zweiten Fall kann das PSDK mit der Borland-Deklaration (erkennbar am T) nichts anfangen, darum ist der Suchbegriff im "title"-Attribut angegeben.

    Der Document Explorer lässt sich übrigens auch in Delphi importieren (Projekt/Typbibliothek importieren -> VsHelp (Version 1.0)), und auf helpware.net findet man eine Kurzübersicht zu den Funktionen. Wer das macht, sollte aber ähnlich wie bei der MS-XML-Typbibliothek eine Funktion schreiben, die prüft ob die Klasse registriert ist.
  3. Ein paar Suchbegriffe öffnen leider die falschen Themen. Das betrifft
    • "CreateDialog" (Fenster und Controls/Dialoge)
    • "TChooseFont" (Standarddialoge/Schriftart)
    • "TFindText" (Standarddialoge/Text suchen)
    • "TranslateAccelerator" (Systemfunktionen/Hotkeys)
    und liegt ganz einfach daran, dass der Suchbegriff auch von anderen Themen benutzt wird. Und der Document Explorer zeigt in dem Fall natürlich das an, was er zuerst findet. Da der Index aber synchronisiert wird (sofern möglich, s. Punkt 1 zur Funktion "SyncIndex") kann man nachschauen ob es noch weitere Einträge dieser Art gibt.
Dennoch stehe ich aber zu solchen Spielereien (nennen wir es ruhig mal so). Ich will damit sagen: Das PSDK wird in den Tutorials als Lektüre empfohlen, und die aus den alten Versionen bekannten Codeschnippsel zur Syntax usw. stammen ja auch daraus. Daher bot es sich natürlich an, die jeweiligen Themen gleich direkt im PSDK zu öffnen. Dass das vom Aufwand her (s. Script) recht leicht war, ist ein Pluspunkt. Dass das benutzte API an sich aber komplett undokumentiert ist (und IMHO auch einige Schwächen offenbart - warum ist bspw. "setCollection" eine Prozedur und keine Funktion mit TRUE/FALSE-Ergebnis?), ist natürlich ein Nachteil.

Also, ich bereue die Entscheidung mit den PSDK-Links nicht, und ich würde es auch wieder tun.
Aber wie seht ihr das? Ihr seid ja die Anwender.


Gruß,
Mathias.

[edit=Luckie]Umfrage auf Wunsch hinzugefügt. Mfg, Luckie[/edit]
  Mit Zitat antworten Zitat