2010-01-25 2 views
5

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

 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 всегда недействителен.

Любая помощь будет оценена по достоинству. Благодарю.

+0

В каком виде это недействительно? Вы получаете ошибку от вызова API? –

+0

Если я делаю вызов, который использует дескриптор, функция возвращает сообщение об ошибке Invalid_Handle. –

+0

игнорируя ручку, называется ли сама функция правильно? – saschabeaumont

ответ

7

Вы должны экспортировать вызываемую функцию так, 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

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

#pragma comment(linker, "/EXPORT:[email protected]@@23mangledstuff#@@@@")

Это создает второй ENTR y в таблице экспорта DLL.

+2

Другой способ гарантировать, что имя функции, не обработанное пользователем, включено в экспорт DLL, - это ЭКСПОРТ в файле DEF и добавление его в свойства компоновщика (Linker -> Input -> File Definition File). – Pierre

Смежные вопросы