gpt4 book ai didi

c++ - 通过 msi.dll 一次更改 MSI 表中列中的所有值

转载 作者:行者123 更新时间:2023-11-28 04:49:14 28 4
gpt4 key购买 nike

MSI 的表 - “FeatureComponents”有两列:“Feature_”和“Component_”。我想要做的是一次更改“Feature_”列中的所有值。

IntPtr hDb = IntPtr.Zero;
int res = MsiInvoke.MsiOpenDatabase(PathToMsi, MsiInvoke.MSIDBOPEN_TRANSACT, out hDb);

string FFF = "SELECT `Feature_` FROM `FeatureComponents`"; <- sql string

IntPtr hView2 = IntPtr.Zero;
res = MsiInvoke.MsiDatabaseOpenView(hDb, FFF, out hView2);
res = MsiInvoke.MsiViewExecute(hView2, IntPtr.Zero);
IntPtr hRec2 = IntPtr.Zero;
res = MsiInvoke.MsiViewFetch(hView2, out hRec2);
res = MsiInvoke.MsiRecordSetString(hRec2, 1, "DUMMY");
res = MsiInvoke.MsiViewModify(hView2, 4, hRec2);
res = MsiInvoke.MsiViewClose(hView2);
res = MsiInvoke.MsiDatabaseCommit(hDb);

但是,这只会更改表中的第一个条目。所以,我想知道,如何遍历表中的所有条目并更改所有列值?就目前而言,我只能对一个条目执行此操作,并且不知道如何将其应用于所有条目。

最佳答案

基本上,您只需将获取代码变成一个循环,然后继续调用 MsiViewFetch,直到获得 ERROR_NO_MORE_ITEMS 结果,每次调用都会返回下一条记录,直到出现该错误。 C++ 中的简单旧示例,但原理是相同的:

while ( (errorI = MsiViewFetch (hViewSELECT, &hRecord))  != ERROR_NO_MORE_ITEMS)
nBuffer = (DWORD)256;
MsiRecordGetString(hRecord, 1, svPropname, &nBuffer);
nBuffer = (DWORD)256;
MsiRecordGetString(hRecord, 2, svPropvalue, nBuffer);
}

关于c++ - 通过 msi.dll 一次更改 MSI 表中列中的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48540183/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com