Прежде всего, я использую Mingw 4.8 в качестве компилятора DLL C++ в Code: блоки 13.12 и Lazarus 1.4.2 для работы с кодом pascal. (Windows 7)
Мне нужно создать dll в C++ или c, который можно вызвать из программы pascal.
Проблема в том, что мой knowlegde о pascal равен null. Это не очень сложно усложнить, чтобы создать простую программу, но я не могу найти хорошую информацию о том, как импортировать и использовать C/C++ DLL.
Единственное, что было безмолвным, было следующим: http://www.drbob42.com/delphi/headconv.htm Мой настоящий код:
Паскаль:
funtion hello():Integer; external 'function' index 1;
...
Label1.Caption:=IntToStr(hello());
C++ Заголовок DLL:
#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;
}
Но при попытке передать любой аргумент или сделать что-то сложное с функцией, начинает давать номера рядов.
Это новый код: Pascal:
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';
Но я получаю сообщение об ошибке:
Функция точки входа процедуры1 не может быть расположена в библиотеке динамических ссылок function.dll
Я ищу пример, который работает или онлайн-учебник, или что-то, чтобы продолжить работу, потому что я очень зациклен на этом. Заранее спасибо.
Вам нужно сделать совпадающие соглашения. В коде C++ используется __stdcall
. Код Pascal не указывает соглашение о вызове и поэтому по умолчанию register
.
Объявите импорт Pascal следующим образом:
function function1(t1:Integer):Integer; stdcall; external 'function' index 1;
Вы уверены, что вам нужно использовать индекс при импорте? Это гораздо чаще используется для импорта по имени, чем по порядку. Я ожидаю увидеть, что импорт выглядит следующим образом:
function function1(t1:Integer):Integer; stdcall; external 'function';
Причина, по которой функция без каких-либо параметров преуспевает, заключается в том, что для функции без параметров различия между конвенцией вызова не имеют значения. Когда вы начинаете передавать аргумент, stdcall
означает, что аргумент передается через стек, а register
означает, что он передается в регистр. Это несоответствие объясняет поведение, которое вы наблюдаете.