gpt4 book ai didi

python - 为 c/c++ 代码编写 ctypes 包装器的正确方法

转载 作者:行者123 更新时间:2023-11-30 20:36:55 24 4
gpt4 key购买 nike

感谢您花时间阅读,我希望您能回答:)

我将首先解释我为尝试纠正问题所做的研究等,只是为了提供一些背景知识。另外,我认为自己拥有相当丰富的 Python 知识。

我查阅了 DLL/API 文档来试图理解,我还花了一天时间温习 C++,试图理解我的问题:

我有一个 C++(我很确定)程序,我想用 python 实现。我觉得我明白如何尝试转换(咳咳),除了有一部分我没有注意到(我知道这是一开始,但我相信其余的应该就位)

#import "pstorec.dll" no_namespace

void foo()
{
IPStorePtr PStore;
IEnumPStoreTypesPtr EnumPStoreTypes;

我无法理解第 5/6 行发生了什么,或者如何在 python/c 中实现它类型。

我试图将它们称为“pstorec.dll”的函数,但是当然,这不起作用,有人可以解释一下吗?我已通读http://starship.python.net/crew/theller/ctypes/tutorial.html我个人找不到解决方案。所以我很清楚我误解了一些东西。

提前谢谢。

p.s,我知道第一个单词(变量?)想要成为一个指针,但除此之外我迷失了。希望有人能理解我的问题:)

完整代码如下:

#import "pstorec.dll" no_namespace

void ListIEProtectedStorageSecrets()
{
IPStorePtr PStore;
IEnumPStoreTypesPtr EnumPStoreTypes;
GUID TypeGUID;
char strSiteUrl[1024];
char strSiteCredentials[1024];
char szItemGUID[1024];
char strUsername[1024];
char strPassword[1024];

HRESULT hRes = PStoreCreateInstance(&PStore, 0, 0, 0);

hRes = PStore->EnumTypes(0, 0, &EnumPStoreTypes);


while( EnumPStoreTypes->raw_Next(1, &TypeGUID, 0) == S_OK )
{
sprintf_s(szItemGUID, 1024, "%x", TypeGUID);

IEnumPStoreTypesPtr EnumSubTypes;
hRes = PStore->EnumSubtypes(0, &TypeGUID, 0, &EnumSubTypes);

GUID subTypeGUID;
while(EnumSubTypes->raw_Next(1,&subTypeGUID,0) == S_OK)
{
IEnumPStoreItemsPtr spEnumItems;
HRESULT hRes = PStore->EnumItems(0, &TypeGUID, &subTypeGUID, 0, &spEnumItems);

//Now enumerate through each of the stored entries.....

LPWSTR strWebsite;
while( spEnumItems->raw_Next(1, &strWebsite, 0) == S_OK)
{
sprintf_s(strSiteUrl, 1024, "%ws", siteName);

unsigned long psDataLen = 0;
unsigned char *psData = NULL;
char *sptr;
_PST_PROMPTINFO *pstiinfo = NULL;

//read the credentails for this website entry
hRes = PStore->ReadItem(0, &TypeGUID, &subTypeGUID, siteName, &psDataLen, &psData, pstiinfo, 0);

if( lstrlen((char *)psData)<(psDataLen-1) )
{
int i=0;
for(int m=0; m<psDataLen; m+=2)
{
if(psData[m]==0)
strSiteCredentials[i]=',';
else
strSiteCredentials[i]=psData[m];
i++;
}

strSiteCredentials[i-1]=0;
}
else
{
sprintf_s(strSiteCredentials, 1024, "%s", psData);
}

//Now decode the username & password from strSiteCredentials for different types

//5e7e8100 - IE:HTTP basic authentication based passwords
//username and passwords are seperated by ':'
if(lstrcmp(szItemGUID, "5e7e8100") ==0 )
{
strPassword[0]=0;
sptr = strstr(strSiteCredentials, ":");

if( sptr != NULL )
{
strcpy_s(strPassword, 1024, sptr+1);
*sptr = 0;
strcpy_s(strUsername, 1024, strSiteCredentials);
}

printf("\n website = %S, username = %s, password = %s", strSiteUrl, strUsername, strPassword);
}


//e161255a - IE autocomplete passwords
if(lstrcmp(szItemGUID,"e161255a")==0)
{

if(strstr(strSiteUrl, "StringIndex" ) == 0 )
{
if(strstr(strSiteUrl,":String")!=0)
*strstr(strSiteUrl,":String")=0;

lstrcpyn(strPassword,strSiteUrl,8);

if( !( (strstr(strPassword,"http:/")==0)&&(strstr(strPassword,"https:/")==0) ) )
{
//username & passwords are seperated by ','
strPassword[0]=0;
sptr = strstr(strSiteCredentials,",");
if( sptr != NULL )
{
strcpy_s(strPassword, 1024, sptr+1);
*sptr = 0;
strcpy_s(strUsername, 1024, strSiteCredentials);
}

printf("\n website = %s, username = %s, password = %s", strSiteUrl, strUsername, strPassword);

}
}

} //end of autocomplete if

} //inner while loop

} //middle while loop

} //top while loop

} //end of function

缩进变得很有趣(是我的错:)),但我不认为它会影响问题,如果你能善意地忽略这一点:)

最佳答案

查看您的完整代码,这绝对是 C++,并且它使用 COM(组件对象模型),而且,该库似乎向您隐藏了大部分 COM“丑陋”。话虽这么说,我不确定您是否会知道 IPStore 到底是什么。

看看this reference有关 COM 的介绍。特别是,请看图 4。我怀疑 IPStorePtr 是一个接口(interface)指针,它允许客户端代码与客户端通信。

我还怀疑 PStoreCreateInstanceCoCreateInstanceQueryInterface 的包装器(两者都是普通 COM API 的一部分)。所以在这行代码中:

HRESULT hRes = PStoreCreateInstance(&PStore, 0, 0, 0); 

hRes 是 PStoreCreateInstance 函数的返回状态(您应该始终检查)。另请注意,我们将 PStore (&PStore) 的地址作为第一个参数传递。如果此函数成功,您将拥有一个指向 COM 对象上的接口(interface)的指针。

在这行代码中:

hRes = PStore->EnumTypes(0, 0, &EnumPStoreTypes);

我们使用指向 COM 对象的指针来调用对象 EnumTypes 中定义的函数。

关于python - 为 c/c++ 代码编写 ctypes 包装器的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34682023/

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