IPStore接口获取IE自动保存的用户名密码(最后一句怎么修改):
//动态加载pstorec.dll,得到PStoreCreateInstance函数地址
typedef HRESULT (WINAPI tPStoreCreateInstance)(IPStore *, DWORD, DWORD, DWORD);
HMODULE hpsDLL;
hpsDLL = LoadLibrary("pstorec.dll");
tPStoreCreateInstance pPStoreCreateInstance;
pPStoreCreateInstance = (tPStoreCreateInstance)GetProcAddress(hpsDLL, "PStoreCreateInstance");
IPStorePtr PStore;
HRESULT hRes = pPStoreCreateInstance(&PStore, 0, 0, 0);
IEnumPStoreTypesPtr EnumPStoreTypes;
hRes = PStore->EnumTypes(0, 0, &EnumPStoreTypes);//指定枚举区域
if (!FAILED(hRes))
{
GUID TypeGUID;
char szItemName[512];
char szItemData[512];
char szResName[1512];
char szResData[512];
char szItemGUID[50];
//枚举密码类型
HRESULT hr=EnumPStoreTypes->raw_Next(0,&TypeGUID,0);
最后一行总出错(可以编译通过,但hr值不对),跟踪发现raw_Next()函数运行出错了,求大侠们指点,应如何改正(Win7系统)。
该回答引用ChatGPT
根据你提供的代码,似乎缺少了一个循环来遍历枚举出来的密码类型。在枚举类型后,应该使用一个循环遍历每个密码类型,然后获取每个密码类型中的密码项。以下是一个修改建议,可以尝试使用:
//枚举密码类型
while (SUCCEEDED(EnumPStoreTypes->raw_Next(1, &TypeGUID, NULL)))
{
IEnumPStoreTypesPtr EnumPStoreItems;
hRes = PStore->EnumItems(&TypeGUID, NULL, NULL, 0, &EnumPStoreItems);
if (!FAILED(hRes))
{
//遍历密码项
while (SUCCEEDED(EnumPStoreItems->raw_Next(1, &szItemGUID, NULL)))
{
//获取密码项名称
hRes = PStore->ReadItem(&TypeGUID, szItemGUID, szResData, sizeof(szResData), &szItemName, sizeof(szItemName), 0);
if (!FAILED(hRes))
{
//处理密码项名称
//...
//获取密码项数据
hRes = PStore->ReadItem(&TypeGUID, szItemGUID, szResData, sizeof(szResData), NULL, 0, 0);
if (!FAILED(hRes))
{
//处理密码项数据
//...
}
}
}
}
}
此外,请注意,使用IPStore接口来获取密码可能会存在以下限制和问题: