MsiViewFetch "SELECT * FROM `Property`"成功,但返回"Incorrect function." C++
MsiViewFetch "SELECT * FROM `Property`" is successful, but returns "Incorrect function." in C++
我想读取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)
相关文章:
- 如何检查 log2 'inbuilt c++ function'是否返回 '-inf'?
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 如何返回用参数包定义的成员函数的std::function对象
- std::function<std::optional<T>()> 如何与返回 T 的 lambda 兼容?
- 如何让"factory function"返回不可复制的对象?
- void *function() 是指向函数的指针还是返回 void* 的函数?
- std::function 中不允许引用返回类型吗?
- 无法将 std::绑定返回值分配给 std::function
- 如何根据"function like"参数推导函数模板的返回类型?
- 从作为模板函数参数传递的 std::function 推导返回和参数类型
- 编译错误:返回引用时"no matching function for call to" static_cast
- 使用 std::function 时选择自动返回类型而不是构造函数的调用运算符
- 如何从std :: function推断返回值类型
- MsiViewFetch "SELECT * FROM `Property`"成功,但返回"Incorrect function." C++
- 有没有办法获取"current function"的返回类型
- C++函数,它接受成员函数并向其返回静态 lambda/std::function
- 确定"generic function"的返回类型
- 检查返回的 std::function 是否在 C++11 中"valid"
- 我返回一个值,但编译器告诉我"function must return a value"
- 移动后是否应该 std::function::运算符布尔值返回 false