4

我正在尝试用 C++ 扩展 Python。我正在使用 Visual C++ 2008 和 Python 2.7。我在构建 .dll 文件时遇到了很多问题,最后当一切似乎都正确时,我无法停止收到此错误:

错误 LNK2001:未解析的外部符号 _ imp _Py_InitModule4

我知道这不是链接器错误,因为我之前遇到过这个错误(它给了我错误,但有各种Py _... 函数),我已经解决了这个问题。

我不知道这是否是重要数据,但我也使用 VC++ 2008 构建了 python27_d.dll。

这是代码:

#include "Python.h"

#include <windows.h>

#include <string.h>

#include <tchar.h>

#include <stdlib.h>

#include <Aclapi.h>

struct file_perms {

  char user_domain[2050];

   unsigned long user_mask;

};




 void lookup_sid ( ACCESS_ALLOWED_ACE* pACE, char user_domain[] ) {

  char username[1024]="";

 char domain[1024]="";



ULONG len_username = sizeof(username);

ULONG len_domain = sizeof(domain);

PSID pSID =(PSID)(&(pACE->SidStart));

SID_NAME_USE sid_name_use;         


LPWSTR username1 = reinterpret_cast<LPWSTR>( username );
LPWSTR domain1 = reinterpret_cast<LPWSTR>( domain );
if (!LookupAccountSid(NULL, pSID, username1, &len_username, domain1, &len_domain, &sid_name_use)){  

    strcpy(user_domain, "unknown");

} else {

    strcat(user_domain,domain);

    strcat(user_domain,"\\");

    strcat(user_domain,username);

}





}











void acl_info( PACL pACL, ULONG AceCount, file_perms fp[]){     

for (ULONG acl_index = 0;acl_index < AceCount;acl_index++){

    ACCESS_ALLOWED_ACE* pACE;



    if (GetAce(pACL, acl_index, (PVOID*)&pACE))         

    {       

        char user_domain[2050]="";  

        lookup_sid(pACE,user_domain);

        strcpy(fp[acl_index].user_domain,user_domain);

        fp[acl_index].user_mask=(ULONG)pACE->Mask;

    }

}

}



static PyObject *get_perms(PyObject *self, PyObject *args)

{



PyObject *py_perms = PyDict_New();

//get file or directory name

char *file;



if (!PyArg_ParseTuple(args, "s", &file))

    return NULL;



//setup security code

PSECURITY_DESCRIPTOR pSD;

PACL pDACL; 

//GetNamedSecurityInfo() will give you the DACL when you ask for

//DACL_SECURITY_INFORMATION. At this point, you have SIDs in the ACEs contained in the DACL. 

LPWSTR file1 = reinterpret_cast<LPWSTR>( file );

ULONG result = GetNamedSecurityInfo(file1,SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, 

&pDACL, NULL, &pSD);



if (result != ERROR_SUCCESS){ return NULL;}

if (result == ERROR_SUCCESS){

    ACL_SIZE_INFORMATION aclSize = {0};

    if(pDACL != NULL){   

        if(!GetAclInformation(pDACL, &aclSize, sizeof(aclSize),

            AclSizeInformation)){

            return NULL;

        }

    }



    file_perms *fp = new file_perms[aclSize.AceCount];

    acl_info(pDACL, aclSize.AceCount, fp );



    //Dict

    for (ULONG i=0;i<sizeof(fp);i++){

        PyObject *domain = Py_BuildValue("s",fp[i].user_domain);

        PyObject *user = Py_BuildValue("s",fp[i].user_mask);

        PyDict_SetItem(py_perms,domain,user);

    }

}

return py_perms;

};













static PyMethodDef fileperm_methods[] = {

{ "get_perms", get_perms, METH_VARARGS, "Execute a shell command." },

{ NULL, NULL, 0, NULL }

};


extern "C"
__declspec(dllexport)
void init_fileperm(void)
{
PyObject *m=Py_InitModule("fileperm",fileperm_methods);

return;
}

我正在使用 Windows 7 64 位。

我知道 Python 3 不推荐使用 Py_InitModule,但我正在使用 Python27 (2.7.3)。

有人知道我为什么会收到此错误吗?

谢谢!

4

1 回答 1

3

我有同样的问题。如果您正在编译 64-bit pyd,请确保python27.lib也是 64-bit (编译 32-bitpyd和 32-bit 也是如此python27.lib)。

于 2016-07-28T10:19:37.423 回答