Вызов функции в С++ из DLL написанной на Delphi

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
lexaw
Сообщения: 2
Зарегистрирован: 10 ноя 2009, 22:59

Есть DLL написанная на Delphi. Присутствует документация. В доке например одна из функций описана так
function IC_reg(aserver_host: Pchar;
aserver_port: Pchar;
arm:char;
user_name,password: Pchar;
var answer: Pchar; abufsize: integer):integer;

Исходные данные:
aserver_host – адрес сервера в числовом виде (например 192.168.5.140).
aserver_port – рабочий порт сервера (6666).
arm – тип клиента; принимает значения:
READER
CATALOG
user_name – имя пользователя, зарегистрированного на сервере.
password – пароль пользователя.
answer – выходной буфер для возвращаемых данных.
abufsize - размер выходного буфера.

Возвращаемые данные:
Код возврата – принимает следующие значения:
ZERO – успешное завершение функции;
CLIENT_NOT_IN_LIST - указанный пользователь не зарегистрирован;
WRONG_PASSWORD – указан неверный пароль;
CLIENT_LIST_OVERLOAD – превышено максимальное кол-во текущих пользователей ;
CLIENT_NOT_ALLOWED – указанный пользователь не имеет доступа к указанному АРМу.
В случае успешного выполнения функции (регистрации) в выходном буфере (answer) возвращается профиль пользователя. Профиль пользователя представляет собой набор строк (т.е. данных, разделенных символами $0D0A) и имеет структуру INI-файла, который определен в учетной записи соответствующего пользователя на сервере. Данные возвращаются в ANSI-кодировке.


как ее грамотно вызвать из С++
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

По имени функции. Язык её разработки значения не имеет. Надо только выяснить, какое соглашение о вызовах использовано при компиляции и выставить для этой конкретной функции то же самое соглашение. Компиляторы обоих языков поддерживает одни и те же соглашения, но соглашения по дефолту не совпадают.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
lexaw
Сообщения: 2
Зарегистрирован: 10 ноя 2009, 22:59

Этот фрагмент из описания говорит о том какое соглашение о вызовах использовано при компиляции??
unit CLIENT;
{файл прототипов функций, констант и кодов возврата для client.dll}
interface

................
...............

function IC_reg(aserver_host: Pchar;
aserver_port: Pchar;
arm:char;
user_name,password: Pchar;
var answer: Pchar; abufsize: integer):integer; stdcall;
И еще я читал что разные компиляторы изменяют имя функции в dll по разному (добавляют подчеркивания, цифры в конце и т.д.)
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

lexaw, если в Delphi ф-ия опсисна как (важное слово - stdcall):

Код: Выделить всё

function IC_reg(aserver_host: Pchar;
aserver_port: Pchar;
arm:char;
user_name,password: Pchar;
var answer: Pchar; abufsize: integer):integer; stdcall;
То в C++ ее опсание будет:

Код: Выделить всё

extern "C" int IC_reg (
  LPCTSTR aserver_host,
  LPCTSTR aserver_port,
  char arm,
  LPCTSTR user_name,
  LPCTSTR password,
  LPTSTR * answer, 
  int abufsize);
(Есть небольшая вероятность, что я мог напортачить с параметром answer - у него не очень тривиально в Delphi - var-параметр PChar).

Если есть возможность для твоего C++-компилятора сделать по DLL lib-файл, то можно будет линковать эту DLL статически. Если нет, то вызывать динамически через LoadLibrary и GetProcAddr
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

stdcal - это и есть название соглашения, под которым его знает паскаль. BBB перевёл его на с.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответить