CustomAction успешно выполняется на компьютере разработчика, не выполняется на компьютере развертывания - PullRequest
1 голос
/ 30 июля 2010

Я создаю установщик WiX для установки программы, которая подключается к базе данных.Чтобы помочь с этим, я создал C dll, который проверяет, существует ли на сервере определенный экземпляр SQL:

extern "C" UINT __stdcall DBConTest(MSIHANDLE hInstaller)

{

FILE *fp;
fp = fopen("dbcontestdll.txt", "w");
_ConnectionPtr pCon;
int iErrCode;
HRESULT hr;
UINT rc;
//init COM

fwprintf(fp, L"entering dbcontest\n");
if(FAILED(hr = CoInitializeEx(NULL,tagCOINIT::COINIT_APARTMENTTHREADED)))
    return ERROR_INVALID_DATA;

fwprintf(fp,L"did coinit\n");
if(FAILED(hr = pCon.CreateInstance(__uuidof(Connection))))
    return ERROR_INVALID_DATA;

fwprintf(fp,L"created instance of connection\n");
TCHAR constr[1024];
DWORD constrlen = sizeof(constr);
rc=MsiGetProperty(hInstaller,TEXT("DBCONNECTIONSTRING"), constr, &constrlen);

fwprintf(fp, L"dbconstring is: %s\n", constr);
TCHAR serverstr[1024];
DWORD serverstrlen = sizeof(serverstr);
rc = MsiGetProperty(hInstaller,TEXT("SQLINSTANCE"),serverstr,&serverstrlen);

fwprintf(fp, L"SQLINSTANCE is: %sl\n",serverstr);
TCHAR finalconstr[2048];
swprintf(finalconstr,L"%s; Data Source=%s;",constr,serverstr);
try{
    hr = pCon->Open(finalconstr,TEXT(""),TEXT(""),adConnectUnspecified);
}
catch(_com_error ce){

    fwprintf(fp, L"%s\n", msg);
    ::MessageBox(NULL,msg,NULL,NULL);
    CoUninitialize();
    MsiSetProperty(hInstaller,TEXT("DBCONNECTIONVALID"),TEXT("0"));
    return ERROR_SUCCESS;

}
if(FAILED(hr)){
    MsiSetProperty(hInstaller,TEXT("DBCONNECTIONVALID"),TEXT("0"));
    return ERROR_SUCCESS;

}
pCon->Close();
CoUninitialize();
MsiSetProperty(hInstaller,TEXT("DBCONNECTIONVALID"),TEXT("1"));
::MessageBox(NULL,TEXT("Successfully connected to the database!"),NULL,NULL);
fwprintf(fp, L"leaving...\n");
fclose(fp);
return ERROR_SUCCESS;

}

Теперь, когда я собираю эту функцию в dll и добавляю ее в свой проект WiX, этот код работает на моей машине для разработки (в частности, установка успешно завершается, и файл "dbcontestdll.txt" существует и содержит правильные данные вэто) - но, когда я запускаю его на компьютере "новой установки", установка завершается неудачно с кодом завершения 2896, и "dbcontestdll.txt" не создается.

Существуют ли предпосылки для использования на основе Cdll в установщике Windows, например, распространяемый C ++?

Ответы [ 4 ]

2 голосов
/ 31 июля 2010

Вы, вероятно, не хотите, чтобы вы попали в ситуацию, когда вам нужно загрузить C ++ redists только для того, чтобы запустить Custom Action.Вы пытались использовать файл |Новый |C ++ Custom Action, который поставляется с WiX?Вы можете использовать это, чтобы заглушить свой CA, а затем скопировать и вставить свой код в него.Это должно дать вам все настройки компилятора и компоновщика, необходимые для избежания этой проблемы.

1 голос
/ 31 июля 2010

Для пользовательских действий я настоятельно рекомендую статически ссылаться на время выполнения Си.Пользовательская библиотека aciton в конечном итоге становится немного больше, но у вас будет меньше зависимость от файлов вне пользовательского действия.

0 голосов
/ 26 июля 2013

У меня тоже была эта проблема. У меня была MFC DLL, которая по умолчанию динамически связывалась, и я забыл включить MSVCR100.DLL в пакет. Конечно, он отлично работал на компьютере разработчика, даже на машинах большинства клиентов, но на старом ПК с Vista это не получалось. Я перешел на статически связанный.

0 голосов
/ 30 июля 2010

Да, вам, вероятно, нужно время выполнения Visual C. Ходок за зависимостями может помочь в поиске необходимых библиотек.

Посмотрите на этот пример, как использовать Bootstrapper . Таким образом, вы можете установить среду выполнения до запуска MSI. Я использую следующую строку начальной загрузки:

<BootstrapperFile Include="Microsoft.Visual.C++.9.0.x86">
  <ProductName>Visual C++ 2008 Runtime Libraries (x86)</ProductName>
</BootstrapperFile>

Этот пакет обычно хранится в каталоге C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\vcredist_x86.

...