Winapi 使用IPersistFile::使用IPropertyStore多次加载
我正在遍历一堆.lnk文件并获取有关它们的信息 对于我这样做的每个文件,这都是js ctypes,但这是一个winapi问题。我删除了错误检查并简化了代码:Winapi 使用IPersistFile::使用IPropertyStore多次加载,winapi,ipropertystorage,ipersistfile,Winapi,Ipropertystorage,Ipersistfile,我正在遍历一堆.lnk文件并获取有关它们的信息 对于我这样做的每个文件,这都是js ctypes,但这是一个winapi问题。我删除了错误检查并简化了代码: var hr_CoInitializeEx = ostypes.API('CoInitializeEx')(null, ostypes.CONST.COINIT_APARTMENTTHREADED); var shellLinkPtr = ostypes.TYPE.IShellLinkW.ptr(); var hr_CoCreateIns
var hr_CoInitializeEx = ostypes.API('CoInitializeEx')(null, ostypes.CONST.COINIT_APARTMENTTHREADED);
var shellLinkPtr = ostypes.TYPE.IShellLinkW.ptr();
var hr_CoCreateInstance = ostypes.API('CoCreateInstance')(ostypes.CONST.CLSID_ShellLink.address(), null, ostypes.CONST.CLSCTX_INPROC_SERVER, ostypes.CONST.IID_IShellLink.address(), shellLinkPtr.address());
shellLink = shellLinkPtr.contents.lpVtbl.contents;
var persistFilePtr = ostypes.TYPE.IPersistFile.ptr();
var hr_shellLinkQI = shellLink.QueryInterface(ostypes.CONST.IID_IPersistFile.address(), persistFilePtr.address());
persistFile = persistFilePtr.contents.lpVtbl.contents;
var propertyStorePtr = ostypes.TYPE.IPropertyStore.ptr();
var hr_shellLinkQI2 = shellLink.QueryInterface(ostypes.CONST.IID_IPropertyStore.address(), propertyStorePtr.address());
propertyStore = propertyStorePtr.contents.lpVtbl.contents;
for (var i = 0; i < arrOSPath.length; i++) {
var hr_Load = persistFile.Load(persistFilePtr, arrOSPath[i], 0);
var ppropvar = ostypes.TYPE.PROPVARIANT();
var hr_GetValue = propertyStore.GetValue(ostypes.CONST.PKEY_AppUserModel_ID.address(), ppropvar.address());
console.log(ppropvar.pwszVal); ////// <<<<< this is fishy
var rez_PropVariantClear = ostypes.API('PropVariantClear')(ppropvar.address());
}
// cleanup
persistFile.Release(persistFilePtr);
propertyStore.Release(propertyStorePtr);
shellLink.Release(shellLinkPtr);
ostypes.API('CoUninitialize')();
然而,ppropvar.pwszVal将成为加载的第一个文件I IPersitFile::的SystemAppUserModelID,这是预期的吗?我是否必须对每个循环进行联合初始化和联合初始化,或者做些什么来解决这个问题
谢谢references.persist文件与pps有什么关系?它们在何处以及如何初始化?请给出一个完整的例子。请不要忽略错误检查。可能是,后续加载失败,或者没有像您预期的那样重新初始化pps。您可能需要为每个文件使用新的pps对象。非常感谢@RemyLebeau的关注。我通过定义pps来澄清它,它是propertyStore,并添加了它周围的内容。我还没有添加错误检查,但我会以一种很好的方式添加它,它非常混乱,但我希望到目前为止的东西能有所帮助这有点混乱,因为这是C++的cType,它是VTABLE的工作,它工作得很好,只是这个特别的问题,没有获得StaseAppServer模式ID,然后是第一个。为什么你要通过PrimeTysPePTR到持久文件?即使使用vtable,Load也不接受4个参数。它有3个参数,其中第一个参数是persistFile对象。在任何情况下,您是否尝试在循环内而不是在循环外创建并释放新的shellLink对象及其辅助接口?我见过许多在IShellLink对象上调用Load的示例,但从未见过在同一对象上多次调用Load的示例。Load通常在新对象上调用。Thank@RemyLebeau抱歉,这就是为什么我在第一个版本中提供了清理过的代码,我忘了在第二个版本中删除它:P这是与ctypes中的vtable指针交互所需的:P我删除了这些,它们肯定没有问题: