我目前正在努力获取一些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;支撑
答案 0 :(得分:0)
使用以下代码似乎可以用于访问函数:
import ctypes
test_dll = ctypes.CDLL("**path to dll**")
test1 = ctypes.WINFUNCTYPE(None)
test2 = test1(("getPath",test_dll))
test2()
不知道为什么在test_dll
的属性中看不到这些功能