Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
Winapi 使用IPersistFile::使用IPropertyStore多次加载_Winapi_Ipropertystorage_Ipersistfile - Fatal编程技术网

Winapi 使用IPersistFile::使用IPropertyStore多次加载

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

我正在遍历一堆.lnk文件并获取有关它们的信息

对于我这样做的每个文件,这都是js ctypes,但这是一个winapi问题。我删除了错误检查并简化了代码:

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我删除了这些,它们肯定没有问题: