Привет сообщество Stackoverflow,
У меня проблемы с вызовом C ++ DLL в пользовательском действии Installscript. Проблема возникает, когда я пытаюсь вызвать мою DLL с параметрами. Изображение ошибки выглядит так:
DLL вызывается с параметрами
значения, параметры успешно обрабатываются в DLL (значения также успешно передаются)
после успешного завершения метода 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;
}
У кого-нибудь есть идея решить эту проблему?
Я немного увлечен точными симптомами и деталями, почему, но я подозреваю, что это может быть WINAPI / stdcall против Cdecl несоответствие соглашения о вызовах. Попробуйте добавить WINAPI
или же STDCALL
(или же __stdcall
) к вашим объявлениям функций c ++, или cdecl
к вашему прототипу InstallScript.
Других решений пока нет …