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

1

Прежде всего, я использую 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

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

Теги:
dll
freepascal
pascal

1 ответ

6
Лучший ответ

Вам нужно сделать совпадающие соглашения. В коде 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 означает, что он передается в регистр. Это несоответствие объясняет поведение, которое вы наблюдаете.

  • 0
    Добавление stdcall; отлично сработало в первом случае, большое спасибо :). Но он не работает без использования индекса. Он продолжает выдавать мне следующую ошибку: «Не удалось найти точку входа в процедуру funtion1 в библиотеке динамических ссылок function.dll» :(
  • 1
    Помните, что я не вижу ваш файл .def или вы экспортировали функцию. Я не думаю, что вы хотите использовать ординалы. Я думаю, что я ответил на вопрос, который вы задали.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню