MsiViewFetch "SELECT * FROM `Property`"成功,但返回"Incorrect function." C++

MsiViewFetch "SELECT * FROM `Property`" is successful, but returns "Incorrect function." in C++

本文关键字:返回 function C++ Incorrect Property SELECT FROM MsiViewFetch 成功      更新时间:2023-10-16

我想读取msi文件的Propery表。该表显示正确。

这是调用和(的一部分)输出:

>ReadMsiProperties.exe evince-2.32.0.145.msi
(MsiOpenDatabase The operation completed successfully.)
(MsiViewFetch Incorrect function.)  WixAppFolder = WixPerUserFolder
(MsiViewFetch Incorrect function.)  WixUIRMOption = UseRM
(MsiViewFetch Incorrect function.)  WIXUI_INSTALLDIR = APPLICATIONFOLDER
(MsiViewFetch Incorrect function.)  ALLUSERS = 2

MsiViewFetch成功,但返回"函数不正确"这是winerror.h 中的错误代码1(error_INVALID_FUNCTION)

我想我错过了什么,不想忽略这个错误。

我试过调试,但似乎无法调试到MsiViewFetch中。

有人有暗示吗?

谢谢,Markus

这是代码:

// Requirements: Add Msi.lib to "Resource Files" 
#include "stdafx.h"
#include <windows.h>
#include <msi.h>
#include <msiquery.h>
MSIHANDLE hDB;
MSIHANDLE hViewSELECT;
MSIHANDLE hRecord; 
TCHAR  svPropname[256];
TCHAR  svPropvalue[256]; 
DWORD nBuffer;
UINT errorI;
_TCHAR errorM[256];

void errorCode2char (UINT error, _TCHAR *buf) {
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 256, NULL);
// chop rn
if (buf[_tcslen(buf)-1] = 'n') buf[_tcslen(buf)-1] = '';
if (buf[_tcslen(buf)-1] = 'r') buf[_tcslen(buf)-1] = '';
}
void _tmain(int argc, _TCHAR* argv[]) {
errorI = MsiOpenDatabase(argv[1], MSIDBOPEN_READONLY, &hDB);
errorCode2char(errorI, errorM);
printf("(MsiOpenDatabase %S)n", errorM);
if (errorI != ERROR_SUCCESS) return;
MsiDatabaseOpenView(hDB, _T("SELECT `Property`, `Value` FROM `Property`"), &hViewSELECT);
MsiViewExecute(hViewSELECT, NULL);
while (errorI = MsiViewFetch (hViewSELECT, &hRecord)  != ERROR_NO_MORE_ITEMS) { // *errorI <-- Incorrect function.
errorCode2char(errorI, errorM);
nBuffer = (DWORD)256; MsiRecordGetString(hRecord, 1, svPropname, &nBuffer);
nBuffer = (DWORD)256; MsiRecordGetString(hRecord, 2, svPropvalue, &nBuffer);
printf("(MsiViewFetch %S)  %S = %Sn", errorM, svPropname, svPropvalue);
}
MsiViewClose(hViewSELECT);
MsiDatabaseCommit(hDB);
MsiCloseHandle(hViewSELECT);
MsiCloseHandle(hDB);
}

编码错误会扭曲MsiViewFetch的返回代码,该返回代码未失真为0(对于ERROR_SUCCESS)。

在c++中,比较(!=)优先于直接赋值(=)。

因此,声明

while (a = b != c)

被解释为

while (a = (b != c))

这不是我的本意。

通过插入括号纠正程序

while ((a = b) != c)

显式

while ((errorI = MsiViewFetch(hView, &hRecord)) != ERROR_NO_MORE_ITEMS)