在python中使用DLL - 无法定位函数或类

时间:2015-07-21 11:04:37

标签: python dll ctypes

我目前正在努力获取一些python代码来定位DLL文件中的函数。 我在这里看了几篇关于这个的帖子,各种方法似乎对我不起作用。 请忽略代码可能是使用Python中的GUI库实现的事实,这对我来说不是一个选项。

所以我的头文件如下:

#pragma once

#ifdef MOBILEFUNC_EXPORTS
#define MOBILEFRONTEND_API __declspec(dllexport)
#else
#define MOBILEFRONTEND_API __declspec(dllimport)
#endif

#ifdef __cplusplus
    class mobileFrontEnd{
    public:
        char* getPath();
    };
#else typedef struct _frontEnd frontEnd;
#endif

#ifdef __cplusplus
extern "C" {
#endif
MOBILEFRONTEND_API mobileFrontEnd *frontend_create();
MOBILEFRONTEND_API char* getPath();

#ifdef __cplusplus
}
#endif



using namespace System;
using namespace System::Windows::Forms;


namespace frontEnd {

    class MOBILEFRONTEND_API mobileFrontEnd
    {
    public:
        static char* getPath(); 
    };
}

我的主要C ++文件是:

#include "stdafx.h"
#include "mobileFrontEnd.h"

using namespace::Runtime::InteropServices;

namespace frontEnd
{

    mobileFrontEnd *frontend_create()
    {
        mobileFrontEnd *self = new mobileFrontEnd;
        return self;
    }

    char* mobileFrontEnd::getPath()
    {
        FolderBrowserDialog^ openDialog1 = gcnew FolderBrowserDialog();
        if (openDialog1->ShowDialog() == DialogResult::OK)
        {
            String^ path = openDialog1->SelectedPath;
            return (char*)(void*)Marshal::StringToHGlobalAnsi(path);
        }
        else
        {
            return 0;
        }
    }
}

DLL在python中使用CDLL或WinDLL函数导入,但是任何访问函数或类的尝试都会导致错误,说明类/函数不存在。 我没有任何真正的python代码,因为我一直试图在python命令提示符下检查它。 我错过了什么来确保它正确导出功能吗?

使用一些python代码编辑: 所以类似于此(来自http://eli.thegreenplace.net/2008/08/31/ctypes-calling-cc-code-from-python

import ctypes
>>> test_dll = ctypes.CDLL("C:\\Users\\xxxx\\Documents\\Visual Studio 2012\\Projects\\mobileFrontEnd\\Release\\mobilefrontend.dll")
>>> test_cb = test_dll.getPath();

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    test_cb = test_dll.getPath();
  File "C:\Python27\lib\ctypes\__init__.py", line 378, in __getattr__
    func = self.__getitem__(name)
  File "C:\Python27\lib\ctypes\__init__.py", line 383, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'getPath' not found
>>>

编辑2: 另外,如果代码中没有清除(正在使用的Windows窗体),则DLL在Visual Studio 2012 Express中编译,并包含“公共库运行时”和#39;支撑

1 个答案:

答案 0 :(得分:0)

使用以下代码似乎可以用于访问函数:

import ctypes

test_dll = ctypes.CDLL("**path to dll**")

test1 = ctypes.WINFUNCTYPE(None)
test2 = test1(("getPath",test_dll))
test2()

不知道为什么在test_dll

的属性中看不到这些功能