Вопрос пользователя касается использования функций, экспортируемых из Delphi DLL, в C-проекте. Пользователь столкнулся с проблемой, так как у него нет исходного кода DLL, и он не может адаптировать ее под свои нужды, изменяя исходный код. Вместо этого, ему необходимо адаптировать свой C-проект под существующую DLL.
Контекст:
ДLL, созданная на Delphi, содержит следующие экспортируемые функции:
function GetCPUID (CpuCore: byte): ShortString; stdcall;
function GetPartitionID(Partition : PChar): ShortString; stdcall;
Проблема:
Пользователь пытался использовать эти функции в своем C-проекте следующим образом, но столкнулся с ошибкой:
Альтернативный ответ:
Пользователю было предложено изменить типы данных для функций, так как ShortString в Delphi не соответствует PChar (char ) в C. ShortString — это массив символов с первым символом, обозначающим длину строки. В C лучше использовать PChar (char ) для всех типов строк.
Подтвержденный ответ:
Так как исходный код 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.