Использование C ++ DLL в Installscript Custom Action - PullRequest
0 голосов
/ 05 октября 2018

Hello Stackoverflow Community,

У меня проблемы с вызовом C ++ DLL в пользовательском действии Installscript.Проблема возникает, когда я пытаюсь вызвать мою DLL с параметрами.Изображение ошибки выглядит следующим образом:

  1. DLL вызывается с параметрами

  2. значения, параметры, успешно обрабатываются в DLL (значения также успешно передаются)

  3. после успешного завершения метода DLL возвращаемое значение не передается, но установка завершается с ошибкой 1603.

Однако, если я вызываю тот же метод без параметров, все работает без проблем.

Не имеет значения, какие параметры или сколько параметров передаются.Как только передается только один параметр, установка завершается неудачно.

Installscript:

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
        //does not work:
        nValue = MsiCppTest.DoSomethingInCpp(sText, nCount);

        //would work:
        nValue = MsiCppTest.DoSomethingOtherInCpp();

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

    return nValue;
end; 

C ++ DLL:

int DoSomethingInCpp(LPCTSTR lpText, int nCount) {
    //The ToDo function is executed successfully with the correct values
    ToDo(lpText, nCount);
    //As soon as the function is completed, the setup is aborted
    return 123;
}

int DoSomethingOtherInCpp() {
    //would work
    ToDo();
    return 321;
}

У кого-нибудь есть идея, чтобы это исправитьпроблема?

1 Ответ

0 голосов
/ 01 ноября 2018

Я немного устала от точных симптомов и подробностей, почему, но я подозреваю, что это может быть WINAPI / stdcall vs cdecl несоответствие соглашения о вызовах.Попробуйте добавить WINAPI или STDCALL (или __stdcall) в ваши объявления функций c ++ или cdecl в ваш прототип InstallScript.

...