Installer + eingeschränkte Funktion



  • Gruß Leute!

    Hab ma zwei Fragen:

    1. Der Installer der in Visual Studio enthalten ist ist ja nich mehr neu. Wo kann ich denn den neuen WinInstaller (*.msi) download? Ist der womöglich in VS .NET (7.0) nur enthalten oder kann ich den auch von der Website von Microsoft oder woanders downloaden???

    2. Hab mal ne Frage zur ner Funktion. Hab vor kurzem die SDK runtergeladen und in VC++ integriert. Nun Fkt.:

    SystemParametersInfo(...);
    
    SPI_GETDESKWALLPAPER --- steht in der SDK Doku, kann ich aber nicht verwenden...
    liegt das daran das die SDK über Internet nicht vollständig bzw. ne Lite-Version ist?
    Oder Wie kann ich SPI_GETDESKWALLPAPER verwenden. (Steht auch drin: Not supported... warum???)
    

    Danke für die Antworten, würd mich freuen

    Cu CaseModder



  • Falls du nichts findest kannst du auch InnoSetup verwenden.
    Turbobrain



  • Hallo,

    CaseModder schrieb:

    1. Der Installer der in Visual Studio enthalten ist ist ja nich mehr neu. Wo kann ich denn den neuen WinInstaller (*.msi) download? Ist der womöglich in VS .NET (7.0) nur enthalten oder kann ich den auch von der Website von Microsoft oder woanders downloaden???

    den Installer gibt es hier:

    http://msdn.microsoft.com/vstudio/downloads/tools/vsi11/download.aspx

    CaseModder schrieb:

    2. Hab mal ne Frage zur ner Funktion. Hab vor kurzem die SDK runtergeladen und in VC++ integriert. Nun Fkt.:

    C/C++ Code:
    SystemParametersInfo(...);

    SPI_GETDESKWALLPAPER --- steht in der SDK Doku, kann ich aber nicht verwenden...
    liegt das daran das die SDK über Internet nicht vollständig bzw. ne Lite-Version ist?
    Oder Wie kann ich SPI_GETDESKWALLPAPER verwenden. (Steht auch drin: Not supported... warum???)

    da hilft dir auch das neueste SDK nichts, den Parameter SPI_GETDESKWALLPAPER gab es in Win 95/98/ME/NT noch nicht, deshalb also für diese Versionen "not supported", in Win 2K/XP wurde er erst eingeführt. Willst du für die "nicht unterstützten" Versionen das "Wallpaper" auslesen, mußt du einen anderen Weg gehen, entweder aus dem INI-File lesen (evtl. Win.INI, ist schon zu lange her), oder über die Registry

    MfG



  • @ Probe-Nutzer

    Danke für den Link zum Installer!

    Was ich bloß nicht verstehe du hast gesagt, dass die Funktion in WinXP/2K eingeführt wurde. Ich hab ja WinXP, da müsst es doch gehen, oder? Das gibt es noch nicht mal in WinXP, das is ja das fragliche.

    Cu CaseModder



  • da ich auch unter XP arbeite, aber noch nicht das aktuelle Platform SDK heruntergeladen/installiert habe (steht auf der ToDo-Liste), konnte ich es hier nicht ausprobieren. Diesen Parameter habe ich bisher bei keiner meiner Anwendungen benötigt (auch nicht unter anderen Win-Versionen, wo es ja sowieso nicht unterstützt wird), bin aber sicher, daß der Parameter unter XP funktionieren muß. Deshalb wäre es vielleicht ganz gut, wenn du erklärst, was nicht funktioniert, den Aufruf der Funktion hier ins Forum stellst, und auch den Rückgabe-Wert auswertest. Wenn du einen Fehler erhältst (Rückgabe-Wert ungleich Null), dann kannst du auch noch GetLastError einsetzen, um den Fehler näher festzustellen, aber vielleicht reicht schon, deinen Code zu sehen...

    MfG



  • @ turbobrain

    Was meinst dun mit InnoSetup???

    -----

    @ Probe-Nutzer

    Ja nee, der Parameter in der Funktion funktioniert nicht. Der steht auch nicht wirklich in der Headerdatei, wo er stehen müsste...? Obwohl er da sein muss!!! Ich denke mal das ich die neuen Headerdateien schon richtig in das VC++ integriert hab. Theoretisch könnte ich ja auch die "alten" Headerdateien rauswerfen - wees nich ob das daran liegt das ich sozusagen, zweimal die gleiche Headerdatei im VC++ hab. Ist doch aber Wurst, oder? Muss ich was anders reg- bzw. deregistrieren damits funktioniert???

    Im Klartext heißt das, die Funktion gibt es, bloß den Parameter nich!!! Wieso???

    Freu mich auf ne Antwort

    Cu CaseModder 🙂



  • nur kurz zum InnoSetup: das ist auch ein Tool, mit dem man Installations-Programme erstellen kann, mit dem habe ich aber noch nicht gearbeitet, kann also nichts dazu sagen.

    Zurück zum Haupt-Problem:

    wenn ich deine Antwort richtig interpretiere, bekommst du also einen Compiler-Fehler, daß SPI_GETDESKWALLPAPER nicht bekannt ist. Dann schaue doch mal nach, ob der neue SDK-Header für winuser.h (dort sind die SPI_-Werte auf jeden Fall bei älteren SDKs definiert) wirklich kein #define für SPI_GETDESKWALLPAPER enthält, und wenn du zwei winuser.h-Header hast, dann schaue in beiden nach.

    Übrigens die "alten" Header mußt du nicht entfernen, aber es gibt eine bestimmte Reihenfolge, welche der Header denn genommen werden, wenn mehrere gleichen Namens vorhanden sind. Wenn ich mich recht erinnere, dann müssen die Include-Verzeichnisse des neuen SDKs vor den alten stehen, unter Menü "Extras"->"Optionen"->Registerkarte "Verzeichnisse" kannst du mit den Pfeilen rechts die Prioritäten ändern.

    Und noch etwas ist wichtig: Um Anwendungen für bestimmte Win-Versionen zu schreiben, mußt du mit einem Makro die Zielplattform angeben (deswegen wurde wohl auch SPI_GETDESKWALLPAPER nicht gefunden), welche das für die jeweilige Win-Version sind, steht hier:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sdkintro/sdkintro/using_the_sdk_headers.asp

    wenn du also auch nur einen Header hast, in dem SPI_GETDESKWALLPAPER vorkommt, dann müßte es nach meiner kleinen Anleitung klappen

    MfG



  • @ Probe-Nutzer

    Ich hab schon mal in die Headerdatei in der neuen SDK geguckt. Da steht der Parameter auch drin. Bloß ist der halt, wie auch weiß, für Versionen Win2k, WinXP und Windows Server 2003 family. Ich denk ma das ich alles richtig konfiguriert hab (neuen Headerdateien in der Entw.-Umgebung...). Das is wie bei der Funktion

    bool LockWorkstation(void);
    

    die Funktion gibt es zwar aber es kommt ein Error, das die nicht gefunden wird, kapier ich nich.
    Ich tu nochmal die Headerdateien separat includen, mal sehen obs funktioniert...

    Also die Includes sind, wie du beschrieben, richtig gesetzt.

    Du hast geschrieben, dass ich die Zielplattform angeben muss. Also für Windows XP:

    _WIN32_WINNT>=0x0501
    WINVER>=0x0501
    

    Un wo soll ich das hinschreiben? Direkt vor die Funktion, bei den Headerfile oder wohin? Also wie muss ich den Makro angeben un wo genau?

    Kann das sein, das ich das bei der Funktion mit der "Computer sperren" (LockWorkstation();) genauso machen, muss weils das ja auf 98, ME... noch net gab???

    Dank dir für deine Antwort

    Cu CaseModder



  • ich möchte versuchen, dir das noch einmal etwas näherzubringen, aus deiner Antwort erkenne ich, daß du noch nicht so vertraut mit bedingter Kompilierung bist.

    In den SDK-Headern werden viele Dinge durch Makros gesteuert, u.a. auch die Zielplattform, also die Festlegung, auf welchen Win-Versionen soll mein Programm funktionieren. Dadurch, daß man erst die Zielplattform mit einem Makro festlegt, wird u.a. auch gewährleistet, daß man nicht versehentlich eine(n) Funktion/Parameter benutzt, die/der erst ab einer bestimmten Version verfügbar ist. Man bekommt schon während des Kompilierens einen Compiler-Fehler, und man weiß, aha, da habe ich etwas benutzt, daß auf dieser Version nicht laufen würde (selbst wenn man das Kompilieren könnte, die Funktionen sind in den System-DLLs, in denen die API-Funktionen stecken, nicht implementiert, man würde dann erst zur Laufzeit einen Fehler bekommen, was meistens in der professionellen Software-Entwicklung viel unangenehmer ist).

    Diese Versions-Festlegung kann man über ein #define machen, das man vor die Header des SDK platziert. Viel üblicher ist allerdings unter VC++ der folgende Weg:

    Menü "Projekt"->"Einstellungen"->Registerkarte C/C++, Kategorie "Allgemein"

    Dort findest du im Feld "Projekt Optionen" die Werte, die die Kompilierung steuern. Dort hängst du jetzt einfach, mit einem /D eingeleitet, die Werte dran.

    Ein Beispiel:

    du hast XP. In der Tabelle, die ich in der letzten Antwort gelinkt habe, findest du als Bedingung für XP:

    _WIN32_WINNT>=0x0501
    WINVER>=0x0501

    also damit Funktionen/Parameter bekannt sind, die erst ab Win XP eingeführt wurden, müssen _WIN32_WINNT und WINVER den "Mindestwert" 0x501 haben. Also müssen im Feld "Projekt Optionen" die Zeichenfolgen

    /D _WIN32_WINNT=0x0501

    und

    /D WINVER=0x0501

    angehängt werden.

    Und jetzt, um auf dein Beispiel "LockWorkStation" zurückzukommen. In winuser.h findest du:

    #if(_WIN32_WINNT >= 0x0500)
    WINUSERAPI
    BOOL
    WINAPI
    LockWorkStation(
        VOID);
    #endif /* _WIN32_WINNT >= 0x0500 */
    

    Und das wird jetzt "mitkompiliert", da _WIN32_WINNT jetzt den "Mindestwert" hat.

    Auf die gleiche Weise benutzt du das Makro _WIN32_IE, welches du auch noch definieren kannst, wenn du Funktionalität des IE brauchst, die erst ab bestimmten Versionen hinzugekommen sind. Dies betrifft z.B. Funktionen aus der Shell-API, aber es ist wie gesagt, nur nötig, wenn du diese Funktionen brauchst.

    Klar ist dann auch: wenn du ein Programm schreiben willst, das ab einer bestimmten Win-Version auf allen Nachfolge-Versionen laufen soll (also z.B nicht nur auf XP, sondern auch noch auf WinME), mußt du immer den passenden kleinsten Wert aus dieser Tabelle heraussuchen, der für die "älteste" dieser Win-Versionen steht.

    Ok, und jetzt will ich mal eine Erfolgsmeldung hören 😉

    MfG



  • @ Probe-Nutzer

    Erfolg! Es hat funktioniert!!!

    Jetzt weiß ich, dank dir, was neues! Da isses nun auch kein Wunder gewesen, dass es zwar die Funtkion gab, aber ich sie nicht benutzen konnte.
    Danke nochmal!!!

    Cu CaseModder 🙂

    PS: Kannst du, wenn du das noch weißt, mir mal sagen aus welchem Tutorial (oder Buch) du die Erkenntnis hast? Ich meine im Nachhinein ist alles nachzuvollziehen, aber man muss es erst mal wissen. Vielleicht kannst du mir einen Tipp geben, woher, damit ich auch noch andere "geheime Features freischalten" kann...



  • @ Probe-Nutzer

    Erfolg! Es hat funktioniert!!!

    Jetzt weiß ich, dank dir, was neues! Da isses nun auch kein Wunder gewesen, dass es zwar die Funtkion gab, aber ich sie nicht benutzen konnte.
    Danke nochmal!!!

    Cu CaseModder 🙂

    PS: Kannst du, wenn du das noch weißt, mir mal sagen aus welchem Tutorial (oder Buch) du die Erkenntnis hast? Ich meine im Nachhinein ist alles nachzuvollziehen, aber man muss es erst mal wissen. Vielleicht kannst du mir einen Tipp geben, woher, damit ich auch noch andere "geheime Features freischalten" kann...



  • das, was ich dir erklärt habe, habe ich weder aus einem Buch noch aus einem Tutorial. Die Schritte, die ich angegeben habe, sind in der MSDN-Library zu finden. Unter

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sdkintro/sdkintro/installing_the_platform_sdk_with_visual_studio.asp

    steht unter den Punkten 2 und 3, wie und wo man die Include- und die Lib-Verzeichnisse n VC++ einstellt.

    Dann steht hier:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sdkintro/sdkintro/using_the_sdk_headers.asp

    die besagte Information, daß man diese Makros setzen muß, damit man keine Compiler-Fehler bekommt.

    Und wie man diese Makros setzt, steht in der Compiler-Referenz zu VC++, die du hier:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_core_.2f.d.asp

    findest.

    Das waren die Schritte, die ich beschrieben und dir zu vermitteln versucht habe. Das einzige Problem ist am Anfang, daß man sich in diesem "MSDN-Dschungel" erst einmal zurechtfinden muß, mit der Zeit findet man dann aber intuitiv (wenn auch nicht immer an der erwarteten Stelle) Beispiele und die richtigen Seiten zu den Problemen.

    Bei der Suche nach weiteren "geheimen Features" muß ich dich leider enttäuschen, denn die Sache mit den Makros ist ja kein Geheimnis, und ist auch nicht so gedacht. Wie gesagt, du findest alles irgendwie und irgendwo in (oder zumindest mit Hilfe) der MSDN-Library heraus, wenn auch, wie in meinem Falle, erst nach einiger (Berufs-)Erfahrung (ok, ein paar andere Internet-Seiten sind auch hilfreich, wenn man mal "ins Stocken" gerät).

    Also zusammengefaßt: zumindest das, was ich dir hier erklärt habe, habe ich nicht aus Büchern/Tutorials (bis auf die Tatsache, daß man mit Präprozessor-Anweisungen #define,#if usw... die Kompilierung steuern kann), sondern nur aus der MSDN-Library, und ich komme damit sehr gut aus, und auf lange Sicht wird dir das auch gelingen.

    also weiter viel Erfolg und Spaß am Programmieren... 👍

    MfG



  • @ Probe-Nutzer

    Danke nochmals für die vielen zahlreichen Erläuterungen, Tipps und Hilfen!!!

    Cya CaseModder 🙂



  • CaseModder schrieb:

    @ turbobrain

    Was meinst dun mit InnoSetup???

    Er meint Inno Setup. Das ist ein sehr guter Freeware-Installer.

    Phips!



  • Danke auch dir Phips!

    Cu CaseModder


Anmelden zum Antworten