WIX C ++ Custom Action - PullRequest
       22

WIX C ++ Custom Action

5 голосов
/ 25 января 2010

У меня есть базовое пользовательское действие WIX:

        UINT __stdcall MyCustomAction(MSIHANDLE hInstaller)
        {   
            DWORD dwSize=0;
            MsiGetProperty(hInstaller, TEXT("MyProperty"), TEXT(""), &dwSize);
            return ERROR_SUCCESS;
        }

Добавлено в установщик:

   <CustomAction Id="CustomActionId" FileKey="CustomDll" DllEntry="MyCustomAction"/>
   <InstallExecuteSequence>
       <Custom Action="CustomActionId" Before="InstallFinalize" />
   </InstallExecuteSequence>

Проблема в том, что независимо от того, что я делаю, дескриптор hInstaller недействителен. Я установил действие для принятия, отложено, изменило место в последовательности InstallExecute, hInstaller всегда недопустим.

Любая помощь будет оценена. Спасибо.

Ответы [ 2 ]

7 голосов
/ 16 марта 2010

Вам нужно экспортировать вызываемую функцию, чтобы MSI могла вызывать ее, используя недоказанное имя в стиле C

Замените ваш код этим

    extern "C" _declspec(dllexport) UINT __stdcall MyCustomAction(MSIHANDLE hInstall);

    extern "C" UINT __stdcall MyCustomAction(MSIHANDLE hInstall)
    {   
        DWORD dwSize=0;
        MsiGetProperty(hInstaller, TEXT("MyProperty"), TEXT(""), &dwSize);
        return ERROR_SUCCESS;
    }
3 голосов
/ 17 июня 2013

Как уже упоминалось здесь , единственный способ преодолеть искажение __stdcall - это использовать:

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

Это создает вторую запись в таблице экспорта DLL.

...