Jump to content


This is a ready-only archive of the InstallSite Forum. You cannot post any new content here. / Dies ist ein Archiv des InstallSite Forums. Hier können keine neuen Beiträge veröffentlicht werden.
Photo

Use C++ Dll in Installscript Custom Action


3 replies to this topic

BkSetupDev

BkSetupDev
  • Full Members
  • 22 posts

Posted 04 October 2018 - 10:42

Hallo zusammen,

 

ich habe Probleme dabei eine C++ DLL in einer Installscript Custom Action aufzurufen. Das Problem entsteht, sobald ich versuche meine DLL mit Parametern aufzurufen. Das Fehlerbild sieht wie folgt aus:

1. Die DLL wird mit Parametern aufgerufen

2. Die Werte, der Parameter, werden in der DLL erfolgreich verarbeitet(Die Werte werden auch erfolgreich übergeben)

3. Nachdem die DLL Methode erfolgreich beendet wurde, wird kein Return Wert übergeben sondern das Setup schlägt mit Error 1603 fehl.

 

Rufe ich allerdings die gleiche Methode ohne Parameter auf, funktioniert alles ohne Probleme.

Dabei ist es irrelevant welche Parameter, oder wie viele Parameter übergeben werden. Sobald nur ein Parameter übergeben wird, schlägt das Setup fehl.

 

Mein Code sieht wie folgt aus:

 

Installscript Aktion:

prototype NUMBER DoSomeThing(HWND, STRING, INT);
prototype NUMBER MsiCppTest.DoSomethingInCpp(STRING, INT);
prototype NUMBER MsiCppTest.DoSomethingOtherInCpp();

function NUMBER DoSomething(hMSi, sText, nCount)
    STRING sSupportDir;
    NUMBER nSize, nResult, nValue;
begin
    nSize = 256;
    nValue = -1;
    MsiGetProperty(hMSi, "SUPPORTDIR", sSupportDir, nSize);
    nResult = UseDLL(sSupportDir ^ "MsiCppTest.dll");    
    if (nResult = 0) then
        //funktioniert nicht:
        nValue = MsiCppTest.DoSomethingInCpp(sText, nCount);

        //würde funktionieren:
        nValue = MsiCppTest.DoSomethingOtherInCpp();

        UnUseDLL(sSupportDir ^ "MsiCppTest.dll");
    endif;

    return nValue;
end; 

C++ DLL:

int DoSomethingInCpp(LPCTSTR lpText, int nCount) {
    //Die machwas Methode wird erfolgreich mit den richtigen Werten ausgeführt
    machwas(lpText, nCount);
    //Sobald die Methode abgeschlossen ist, bricht das Setup ab 
    return 123;
}

int DoSomethingOtherInCpp() {
    //würde funktionieren
    machwas();
    return 321;
}

Benutzt wird IS2016 SP2.

 

Hat jemand von euch eine Idee, wie man dieses Problem beheben kann?

 

Viele Grüße



Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 08 October 2018 - 09:40

Also generell muss eine Custom Action 0 zurückliefern, alles andere wird als Fehler gewertet und führt zum Abbruch des Setups (außer du hast die Option "ignore exit code" gewählt). Aber wenn ich dich richtig verstanden habe kommt es gar nicht so weit? Und es müsste ja bei 321 genauso abbrechen wie bei 123.



BkSetupDev

BkSetupDev
  • Full Members
  • 22 posts

Posted 09 October 2018 - 12:18

Nicht ganz. Ich rufe diese DLL in einer Installscript Custom Action auf(http://helpnet.insta...DLLFunction.htm ). Dadurch habe ich die Möglichkeit auch einen Return Wert !=0 zu verarbeiten. Die "DoSomeThingOtherInCpp" Funktion liefert mir den Return Wert 321, diesen kann ich im Setup ohne Probleme verarbeiten und es entsteht keine Fehlermeldung. Sobald ich allerdings einen Parameter(egal welcher Datentyp) übergebe, bricht das Setup beim Return Wert(egal welcher Wert) ab. Vorher werden sämtliche Aktionen in der Methode, mit den richtigen Parameterwerten, ausgeführt. Anschließend werden keine weiteren Aktionen im Installscript (Messagebox, usw.) ausgeführt. Das Setup wird an Ort und Stelle sofort abgebrochen.



Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 12 October 2018 - 10:17

Meine Sorge war das return nValue; am Ende der Script-Funktion. (Um den Wert im Setup weiter zu verarbeiten, musst du ihn doch in einem Property speichern?)

Aber wenn das Setup direkt abstürzt (also nicht sauber mit einer Fehlermeldung endet sondern direkt "stirbt") liegt das Problem wohl wo anders. Leider habe ich gerade keine Idee, wo (Stack?). Wenn du ein kleines Win32 Testprogramm (also nicht in InstallShield) schreibst, funktioniert der Aufruf dort?