Veröffentlicht 8. März 200421 j Hallo Leutz, ich versuche in ein bestehendes MSI Paket und in einer bestehenden Table, einen neuen Eintrag einzufügen. Leider bekomme ich immer wieder den Fehler 1627 (ERROR_FUNCTION_FAILED 1627L // Function failed during execution.) bei der Methode MsiViewModify. Warum? Was habe ich vergessen oder was mach ich falsch? //----------------------------------------- HRESULT hr = CoInitializeEx( NULL, 0 ); UINT result; LPCTSTR szPackagePath = _T("D:\\Pakete\\Adobe Reader 6.0 Deutsch\\Adobe Reader 6.0 Deutsch neu\\Adobe Reader 6.0 - Deutsch.msi"); PMSIHANDLE hDatabase = 0; PMSIHANDLE hRecord = 0; PMSIHANDLE hView = 0; if (ERROR_SUCCESS == MsiOpenDatabase(szPackagePath, MSIDBOPEN_TRANSACT, &hDatabase)) { LPCSTR szSQL = _T("INSERT INTO `Registry` (`Registry`,`Root`,`Key`,`Name`,`Value`,`Component_`) VALUES (?,?,?,?,?,?)"); result = MsiDatabaseOpenView(hDatabase, szSQL,&hView); if(result == ERROR_BAD_QUERY_SYNTAX){AfxMessageBox(_T("****** SQL!!!"));} if(result == ERROR_INVALID_HANDLE){AfxMessageBox(_T("Zugriff auf Installer verweigert!!!"));} if(result == ERROR_SUCCESS) { hRecord = MsiCreateRecord(6); if(hRecord) { result = MsiRecordSetString(hRecord, 1, _T("Test1")); result = MsiRecordSetString(hRecord, 2, _T("Test2")); result = MsiRecordSetInteger(hRecord, 3, 3); result = MsiRecordSetString(hRecord, 4, _T("Test4")); result = MsiRecordSetString(hRecord, 5, _T("Test5")); result = MsiRecordSetString(hRecord, 6, _T("Test6")); if(!result) result = MsiViewModify(hView,MSIMODIFY_INSERT, hRecord); if(!result) result = MsiViewClose(hView); if(!result) result = MsiDatabaseCommit(hDatabase); } } } if (hRecord) result = MsiCloseHandle(hRecord); if (hDatabase) result = MsiCloseHandle(hDatabase); CoUninitialize(); //-----------------------------------------
9. März 200421 j Ok habs alles stimmt, habe einen kleinen Dreher in der Zeile LPCSTR szSQL = _T("INSERT INTO `Registry` (`Registry`,`Root`,`Key`,`Name`,`Value`,`Component _`) VALUES (?,?,?,?,?,?)"); ... //falsch result = MsiRecordSetString(hRecord, 1, _T("Test1")); result = MsiRecordSetString(hRecord, 2, _T("Test2")); result = MsiRecordSetInteger(hRecord, 3, 3); ... ... //richtig result = MsiRecordSetString(hRecord, 1, _T("Test1")); result = MsiRecordSetInteger(hRecord, 2, 3); result = MsiRecordSetString(hRecord, 3, _T("Test2")); ...
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.