Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MsiViewFetch从“属性”中选择“*”是成功的,但在C++中返回“不正确的函数”。_C++_Installation_Windows Installer - Fatal编程技术网

MsiViewFetch从“属性”中选择“*”是成功的,但在C++中返回“不正确的函数”。

MsiViewFetch从“属性”中选择“*”是成功的,但在C++中返回“不正确的函数”。,c++,installation,windows-installer,C++,Installation,Windows Installer,我想读取msi文件的属性表。 该表显示正确 这是调用和输出的一部分: >ReadMsiProperties.exe evince-2.32.0.145.msi (MsiOpenDatabase The operation completed successfully.) (MsiViewFetch Incorrect function.) WixAppFolder = WixPerUserFolder (MsiViewFetch Incorrect function.) WixUIRM

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

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

>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错误\u无效\u函数

我想我错过了什么,不想忽视错误

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

有人有什么暗示吗

谢谢,, 马库斯

代码如下:

// 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 \r\n
    if (buf[_tcslen(buf)-1] = '\n') buf[_tcslen(buf)-1] = '\0';
    if (buf[_tcslen(buf)-1] = '\r') buf[_tcslen(buf)-1] = '\0';
}

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 = %S\n", errorM, svPropname, svPropvalue);
    }
    MsiViewClose(hViewSELECT);
    MsiDatabaseCommit(hDB);
    MsiCloseHandle(hViewSELECT);
    MsiCloseHandle(hDB);
}

编码错误会使MsiViewFetch的返回代码失真,如果出错,则未失真的返回代码为0

在C++中,比较!优先于直接赋值=

因此,一项声明

while (a = b != c)
被解释为

while (a = (b != c))
这不是我的意图

程序通过插入括号进行更正

while ((a = b) != c)
明确地

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

第一次检查时,这看起来不错,但一定是出了什么问题。对MsiDatabaseOpenView和MsiViewExecute的调用返回什么?如果MSsiBaseAsOpenVIEW成功,HVSESECK中有什么?嗨,米迦勒,根本原因是C++,而不是MSI。我需要说while errorI=MsiViewFetchhView,&hRecord!=错误\u没有\u更多\u项目,尽管我还不明白为什么。关于你的问题:一切都起作用了,只有errorI的值被扭曲了:-为什么优先级规则不能拯救我?而a=b!=c{}与a=b!=使我惊讶的是,比较and==优先于直接赋值=。因此,当a=b!=c被解释为a=b!=这不是我的本意。问题中给出的代码在a=b!=c在errorI=MsiViewFetchhView,&hRecord!=错误\u没有\u更多\u项目啊,微妙!我本应该抓到的,但我太忙了,看Msi电话流。看起来你现在可以回答这个问题了,但我不认为这个问题对其他人有多大帮助。