2015-07-16 3 views
1

Прежде всего я использую MinGW 4.8, как составителя DLL C++ в коде:. Блоки 13,12 и Lazarus 1.4.2 для работы с паскаль кода (Windows 7)Использование C/C DLL ++ с FreePascal

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

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

Единственное, что большеменьше работал было так: http://www.drbob42.com/delphi/headconv.htm Мой реальный код:

Pascal:

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

заголовок DLL C++:

#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 

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

Pascal:

function function1(t1: Integer): Integer; external '[email protected]:function.dll'; 

Но я получаю ошибку о том, что:

The procedure entry point function1 could not be located in the dynamic link library function.dll

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

ответ

6

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

Объявите импорт Паскаля так:

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» :( – JoseleMG

+1

Помните, что я не вижу ваш файл .def, или, тем не менее, вы экспортировали функцию. Я не думаю, что вы хотите использовать ординалы. Думаю, я ответил на вопрос, который вы задали. –

Смежные вопросы