Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将.lib和.h文件转换为可在Python中使用的DLL_Python_C++_Dll_.lib - Fatal编程技术网

将.lib和.h文件转换为可在Python中使用的DLL

将.lib和.h文件转换为可在Python中使用的DLL,python,c++,dll,.lib,Python,C++,Dll,.lib,因此,我试图将.lib文件中包含的一些函数导入到Python中,以构建一个SDK,使我能够与一些特殊的硬件组件进行对话。我在网上看到,将.lib文件导入Python并不容易: 因此,我尝试使用.lib及其相应的.h文件构建一个dll。我没有访问.lib源代码的权限。我只能访问.h文件。我在网上搜索发现: 因为我正在为Python构建DLL,所以无法使用.def文件。我尝试直接将.h和.lib文件导入到项目中并创建一个dll文件,但函数没有实现。因此,我尝试创建一个名为wrapper的单独的.

因此,我试图将.lib文件中包含的一些函数导入到Python中,以构建一个SDK,使我能够与一些特殊的硬件组件进行对话。我在网上看到,将.lib文件导入Python并不容易:

因此,我尝试使用.lib及其相应的.h文件构建一个dll。我没有访问.lib源代码的权限。我只能访问.h文件。我在网上搜索发现:

因为我正在为Python构建DLL,所以无法使用.def文件。我尝试直接将.h和.lib文件导入到项目中并创建一个dll文件,但函数没有实现。因此,我尝试创建一个名为wrapper的单独的.h文件,它将.h文件中的函数包装起来并调用它们,但这些函数仍然没有实现和工作。老实说,我非常怀疑我所做的是正确的

这是我的密码:

hardware.h-与.lib文件一起提供的头文件(注意,只提供一个函数)

_h-原始头文件的包装器

#pragma once

#include <Windows.h>

#ifdef Hardware_EXPORTS
#define Hardware_API __declspec(dllexport) 
#else
#define Hardware_API __declspec(dllimport) 
#endif

namespace Hardware
{
    class Functions
    {
        public:
            static Hardware_API int NewGetDigitalOutputInfo(unsigned int deviceNumbers[16], unsigned int numBits[16], unsigned int numLines[16]);
    };

}

无论如何,我觉得制作一个包装器是毫无意义的,因为我应该能够直接使用原始的.h文件和.lib文件来调用函数。除非制作包装器是我在不获取lib文件源代码的情况下制作dll的唯一方法。有没有办法在不知道库文件源代码的情况下创建dll?有没有办法将lib文件直接导入Python?感谢您的帮助

谢谢@qexyn的帮助。因此,我从包装器(_hardware.h)中取出名称空间和类,并将函数设置为全局函数。然后,我将extern“C”添加到这些全局函数中,因此我的代码最终如下所示:

_硬件

#pragma once

#include <Windows.h>

#ifdef Hardware_EXPORTS
#define Hardware_API __declspec(dllexport) 
#else
#define Hardware_API __declspec(dllimport) 
#endif

extern "C" Hardware_API int NewGetDigitalOutputInfo(unsigned int deviceNumbers[16], unsigned int numBits[16], unsigned int numLines[16]);
#pragma一次
#包括
#ifdef硬件导出
#定义硬件API declspec(dllexport)
#否则
#定义硬件API declspec(dllimport)
#恩迪夫
外部“C”硬件\u API int NewGetDigitalOutputInfo(无符号整数设备编号[16]、无符号整数编号[16]、无符号整数编号[16];

在那之后,一切顺利。我能够在我的python SDK中获得硬件信息。确保添加外部“C”,否则名称会被弄乱,如果在dependency walker中查找函数,它会显示得很难看。感谢您的帮助

我很确定您将需要使用包装器方法。但是,为了让Python调用到包装器DLL,函数应该是C而不是C++。删除所有名称空间和类语法,只需将全局函数外部化为“C”(就像在与库匹配的头中一样)。将Hardware_API宏保存在其中,并确保在构建DLL时定义了Hardware_导出。@谢谢!因此,我放弃了名称空间和类语法,但当我向全局函数中添加extern“C”时,就像这样:“PlexDO_API extern“C”int DOGetDigitalOutputInfo(无符号整数设备编号[16]、无符号整数编号[16]、无符号整数编号[16]);”这些函数没有被构建,我不能通过Python或C++访问它们。如果我没有外部“C”,我仍然可以使用DLL,而不管我构建了什么C++应用程序,但是Python都不能访问它们。我知道Python使用DLL需要外部“C”。我写错了吗?
#include "stdafx.h"
#include "hardware.h"
#include "_hardware.h"
#pragma comment(lib, "..\\lib\\PlexDO.lib")
#pragma comment(lib, "legacy_stdio_definitions.lib")

namespace Hardware
{
    int Functions::NewGetDigitalOutputInfo(unsigned int deviceNumbers[16], unsigned int numBits[16], unsigned int numLines[16]) {
        return GetDigitalOutputInfo(deviceNumbers, numBits, numLines);
    }
}
#pragma once

#include <Windows.h>

#ifdef Hardware_EXPORTS
#define Hardware_API __declspec(dllexport) 
#else
#define Hardware_API __declspec(dllimport) 
#endif

extern "C" Hardware_API int NewGetDigitalOutputInfo(unsigned int deviceNumbers[16], unsigned int numBits[16], unsigned int numLines[16]);