Конвертируйте файл.lib и.h в DLL, которую можно использовать в Python

Поэтому я пытаюсь импортировать некоторую функцию, содержащуюся в файле.lib, в Python для создания SDK, который позволит мне общаться с некоторыми специальными аппаратными компонентами. Я прочитал в Интернете, что импортировать файл.lib в Python не так-то просто:

Статическая библиотека (.lib) для проекта Python

Поэтому я пытаюсь построить DLL, используя.lib и соответствующий ему файл.h. У меня нет доступа к исходному коду.lib. Все, что у меня есть, - это файл.h. Я посмотрел онлайн и нашел это:

Преобразование статической библиотеки ссылок в динамическую DLL

Поскольку я собираю DLL для Python, я не могу использовать файл.def. Я попытался напрямую импортировать файлы.h и.lib в проект и создать файл dll, но функции не были реализованы. Поэтому я попытался создать отдельный файл.h с именем wrapper, который оборачивает функции в файле.h и вызывает их, но функции все еще не реализованы и не работают. И, честно говоря, я очень сомневаюсь, что я сделал правильно

Вот мой код:

hardware.h - файл заголовка, поставляемый вместе с файлом.lib (обратите внимание, только с одной функцией)

extern "C" int WINAPI GetDigitalOutputInfo(unsigned int deviceNumbers[16], 
                                            unsigned int numBits[16], 
                                            unsigned int numLines[16]);

_hardware.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]);
    };

}

Hardware.cpp - реализация оболочки

#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);
    }
}

В любом случае, я чувствую, что делать обертку бессмысленно, так как я могу просто использовать исходный файл.h и файл.lib для вызова функций. Если только создание оболочки не является единственным способом, которым я могу создать dll без получения исходного кода файла lib. Есть ли способы сделать DLL, не зная исходного кода файла lib? Есть ли способ импортировать файл lib прямо в Python? Любая помощь приветствуется.

1 ответ

Спасибо @qexyn за помощь. Поэтому я вынул пространство имен и класс из своей оболочки (_hardware.h) и сделал функции глобальными. Затем я добавил extern "C" в эти глобальные функции, поэтому мой код в итоге выглядел так:

_hardware.h

#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]);

После этого все заработало. Я смог получить информацию об оборудовании в моем Python SDK. Обязательно добавьте extern "C", иначе имена будут искажены, и это будет выглядеть ужасно, если вы посмотрите свою функцию в обходчике зависимостей. Спасибо за помощь

Другие вопросы по тегам