Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Импорт функций из DLL на Delphi в C-проект: решение проблемы типов данных

Delphi , Файловая система , DLL и PlugIns

Вопрос пользователя касается использования функций, экспортируемых из Delphi DLL, в C-проекте. Пользователь столкнулся с проблемой, так как у него нет исходного кода DLL, и он не может адаптировать ее под свои нужды, изменяя исходный код. Вместо этого, ему необходимо адаптировать свой C-проект под существующую DLL.

Контекст: ДLL, созданная на Delphi, содержит следующие экспортируемые функции:

function GetCPUID (CpuCore: byte): ShortString; stdcall;
function GetPartitionID(Partition : PChar): ShortString; stdcall;

Проблема: Пользователь пытался использовать эти функции в своем C-проекте следующим образом, но столкнулся с ошибкой:

typedef char* (_stdcall *GETCPUID)(BYTE);
typedef char* (_stdcall *GETPID)(PCHAR);
GETCPUID pGetSerial;
GETPID pGetPID

HMODULE hWtsLib = LoadLibrary("HardwareIDExtractor.dll");
if (hWtsLib){
    pGetSerial = (GETCPUID)GetProcAddress(hWtsLib, "GetCPUID");
    char *str = (char*) malloc(1024);
    str = pGetSerial((BYTE)"1"); // Ошибка здесь

    pGetPID= (GETPID )GetProcAddress(hWtsLib, "GetPartitionID");
    char *str1 = (char*) malloc(1024);
    str1 = pGetPID("C:"); // Ошибка здесь
}

Альтернативный ответ: Пользователю было предложено изменить типы данных для функций, так как ShortString в Delphi не соответствует PChar (char ) в C. ShortString — это массив символов с первым символом, обозначающим длину строки. В C лучше использовать PChar (char ) для всех типов строк.

procedure GetCPUID (CpuCore: byte; CpuId: PChar; Len: Integer); stdcall;
procedure GetPartitionID(Partition : PChar; PartitionId: PChar; Len: Integer); stdcall;

Подтвержденный ответ: Так как исходный код DLL недоступен, необходимо творчески подойти к решению проблемы на стороне C. Функции, использующие вызов по соглашению stdcall, передают параметры справа налево, что означает, что адрес результата передается последним. Это означает, что в C-проекте адрес результата должен быть первым параметром. Пример для функции GetCPUID:

typedef struct ShortString {
    char len;
    char data[255];
} ShortString;

typedef void (_stdcall *GETCPUID)(ShortString *result, BYTE cpuCore);

GETCPUID pGetSerial;

HMODULE hWtsLib = LoadLibrary("HardwareIDExtractor.dll");
if (hWtsLib) {
    ShortString serial;
    pGetSerial = (GETCPUID)GetProcAddress(hWtsLib, "GetCPUID");
    pGetSerial(&serial, '1'); // Передаем адрес структуры и значение параметра
    char *str = malloc(serial.len + 1); // Выделяем память, включая место для символа завершения строки
    strlcpy(str, serial.data, serial.len); // Копируем данные из ShortString в C-строку
    str[serial.len] = '\0'; // Добавляем символ завершения строки
}

Оставляем функцию GetPartitionID в качестве упражнения для читателя. Важно помнить, что в C-компиляторе также есть знания о вызовах по соглашению stdcall, и если Delphi код ожидает, что результат будет последним параметром, то и в C-коде его следует объявить последним.

Создано по материалам из источника по ссылке.

Пользователь пытается интегрировать функции из DLL, написанной на Delphi, в свой C-проект, сталкиваясь с проблемами соглашения вызовов и типов данных между языками.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:26:54/0.0031569004058838/0