데이터베이스에 연결하는 프로그램을 설치하기 위해 WiX 설치 프로그램을 만듭니다. 이제CustomAction이 개발 컴퓨터에서 성공하고 배포 컴퓨터에서 오류가 발생합니다.
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;
}
,이 돕기 위해, 나는 SQL의 특정 인스턴스가 서버에 존재하는지 확인하는 C DLL을 만들었습니다 이 함수를 dll에 빌드하고 내 WiX 프로젝트에 추가하면이 코드는 내 개발 컴퓨터에서 작동합니다 (특히 설치가 성공적으로 끝나고 "dbcontestdll.txt"파일이 존재하며 올바른 데이터가 있음).하지만, "새로 설치"컴퓨터에서 실행하면 설치가 종료 코드 2896으로 실패합니다. "dbcontestdll.txt"가 작성되지 않았습니다.
Windows Installer에서 C++ 재배포 가능 파일과 같은 C 기반 dll을 사용하기위한 전제 조건이 있습니까?
나는이 솔루션을 사용하여 끝났다./MD 스위치 대신/MT 스위치를 사용했습니다. – Davidann