Прежде всего я использую 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
Я ищу пример, который работает или онлайн-учебник или что-то, чтобы продолжать работать, потому что я очень застрял с этим.
Заранее спасибо.
Вам нужно сделать так, чтобы соглашения о вызовах совпадали. Ваш код C ++ использует __stdcall
, Код Паскаля не определяет соглашение о вызовах и поэтому по умолчанию register
,
Объявите импорт Pascal следующим образом:
function function1(t1:Integer):Integer; stdcall; external 'function' index 1;
Вы уверены, что вам нужно использовать индекс при импорте? Импортировать по имени гораздо чаще, чем по порядковому номеру. Я ожидаю, что импорт будет выглядеть так:
function function1(t1:Integer):Integer; stdcall; external 'function';
Причина успеха функции без параметров заключается в том, что для функции без параметров различия между соглашениями о вызовах не имеют значения. Как только вы начинаете передавать аргумент, stdcall
означает, что аргумент передается через стек, и register
означает, что это передается в регистре. Это несоответствие объясняет поведение, которое вы наблюдаете.