delphi — Использование C / C ++ DLL с FreePascal

Прежде всего я использую Mingw 4.8 в качестве компилятора DLL C ++ в Code: блоки 13.12 и Lazarus 1.4.2 для работы с кодом паскаля. (Windows 7)

Мне нужно сгенерировать dll в c ++ или c, который можно вызвать из программы на паскале.

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

Единственное, что бездарно сработало, так это: http://www.drbob42.com/delphi/headconv.htm
Мой настоящий код:

Паскаль:

funtion hello():Integer; external 'function' index 1;
...
Label1.Caption:=IntToStr(hello());

C ++ DLL header:

#ifndef function_H
#define function_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef BUILDING_DLL
#define FUNCTION_DLL __declspec(dllexport)
#else
#define FUNCTION_DLL __declspec(dllimport)
#endif
int __stdcall FUNCTION_DLL hello( );

#ifdef __cplusplus
}
#endif
#endif

C ++ файл:

    #include <stdio.h>

#include "function.h"__stdcall int hello( )
{
return 8;
}

Но когда пытаются передать какой-либо аргумент или сделать что-то сложное с функцией, начинает давать случайные числа.

Это новый код:
Паскаль:

function function1(t1:Integer):Integer; external 'function' index 1;
...
entero:=8;
Label1.Caption:=IntToStr(function1(entero2));

Также я обновляю код C ++ к этому:

C ++:

#include <stdio.h>

#include "function.h"__stdcall int function1(int t1)
{
return t1*2;
}

Заголовок:

#ifndef funtion_H
#define funtion_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef BUILDING_DLL
#define FUNCTION_DLL __declspec(dllexport)
#else
#define FUNCTION_DLL __declspec(dllimport)
#endif
int __stdcall FUNCTION_DLL function1(int t1);

#ifdef __cplusplus
}
#endif
#endif

Я также прочитал эту другую информацию:http://www.jrsoftware.org/ishelp/index.php?topic=scriptdll. И попытался реализовать вызов DLL следующим образом:

Паскаль:

function function1(t1: Integer): Integer; external 'function1@files:function.dll';

Но я получаю сообщение об ошибке:

Точка входа процедуры function1 не может быть расположена в
библиотека динамических ссылок function.dll

Я ищу пример, который работает или онлайн-учебник или что-то, чтобы продолжать работать, потому что я очень застрял с этим.
Заранее спасибо.

1

Решение

Вам нужно сделать так, чтобы соглашения о вызовах совпадали. Ваш код C ++ использует __stdcall, Код Паскаля не определяет соглашение о вызовах и поэтому по умолчанию register,

Объявите импорт Pascal следующим образом:

function function1(t1:Integer):Integer; stdcall; external 'function' index 1;

Вы уверены, что вам нужно использовать индекс при импорте? Импортировать по имени гораздо чаще, чем по порядковому номеру. Я ожидаю, что импорт будет выглядеть так:

function function1(t1:Integer):Integer; stdcall; external 'function';

Причина успеха функции без параметров заключается в том, что для функции без параметров различия между соглашениями о вызовах не имеют значения. Как только вы начинаете передавать аргумент, stdcall означает, что аргумент передается через стек, и register означает, что это передается в регистре. Это несоответствие объясняет поведение, которое вы наблюдаете.

6

Другие решения