Pergunta

Eu tenho uma ação personalizada básica do Wix:

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

Adicionado ao instalador:

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

O problema é que, não importa o que eu faça, o hidráulho Hinstaller não é válido. Definei a ação para cometer, adiada, mudei o local na sequência Installexecute, o Hinstaller sempre é válido.

Qualquer ajuda seria apreciada. Obrigado.

Foi útil?

Solução

Você precisa exportar a função chamada para que o MSI possa chamá -lo usando o nome do estilo C não decorado

Substitua seu código por este

    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;
    }

Outras dicas

Como mencionado aqui, a única maneira de superar o alcance de um __stdcall é usar:

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

Isso cria uma segunda entrada na tabela de exportação de DLL.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top