Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
kaban4ig
2 / 2 / 0
Регистрация: 14.12.2010
Сообщений: 37
#1

Подключение DLL сделанной на delphi - C++

25.12.2012, 00:02. Просмотров 2356. Ответов 9
Метки нет (Все метки)

Всем привет. У меня есть 1) с++ Empty project в студии 2012 2) dll сделанная на Delphi. В dll функция возвращающая integer. Задача использовать функцию в коде с++ и результат записать в переменную int. Как это сделать ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2012, 00:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подключение DLL сделанной на delphi (C++):

подключение dll - C++
Подскажите в чем проблема Текст Prog.cpp #include <windows.h> #include <iostream.h> #include <stdio.h> #include <conio.h> ...

подключение dll - C++
Подключаю dll и при определении класса из dll вылезают такие ошибки, помогите пожалуйста :) : Error 1 error LNK2005: "int __cdecl...

Подключение dll библиотеки - C++
Привет. Для работы с шаговым двигателем мне необходимо воспользоваться приложенной к нему dll библиотекой в которой как раз и реализованы...

Статическое подключение DLL - C++
Хочу подключить dll в файл при компиляции в VC++ Project -> Settings... -> Вкладка General -> раскрываемый список Microsoft foundation...

Динамическое подключение DLL - C++
Здравствуйте! Скорее всего, мой вопрос покажется вам глупым, но всё же... Я не могу динамически подключить библиотеку. Когда подключаю...

Подключение dll - ошибка - C++
Собрал свою dll и header .... Далее закинул их в папку с проектом и добавил в проект (Project->Add Existing Item) ... Подключил header...

9
palva
2628 / 1855 / 268
Регистрация: 08.06.2007
Сообщений: 7,088
Записей в блоге: 4
25.12.2012, 00:16 #2
Вот здесь почитайте http://ru.wikibooks.org/wiki/DLL
Естественно DLL должна быть нормально написана, не запрашивать память явным или неявным образом, в частности не использовать длинные строки и, естественно, не содержать обращений к VCL.
1
kaban4ig
2 / 2 / 0
Регистрация: 14.12.2010
Сообщений: 37
25.12.2012, 00:47  [ТС] #3
Подскажите пожалуйста как реализовать
* Указываем, что тело функции находится в другом файле.
* Не забыть про объектный модуль DLL при линковке
Это написано на http://ru.wikibooks.org/wiki/DLL в импорте из DLL C++
0
palva
2628 / 1855 / 268
Регистрация: 08.06.2007
Сообщений: 7,088
Записей в блоге: 4
25.12.2012, 01:26 #4
Если у вас студия Микрософтовская, то вы должны составить def-файл и включить его в проект.
Это один вариант. http://msdn.microsoft.com/ru-ru/library/d91k01sh.aspx
Можно экспортировать функцию при помощи статической библиотеки .lib
Если это си-билдер, то можно использовать тот файл .lib, который был создан при комппиляции библиотеки в делфи.
Для Микрософта библиотека .lib должна иметь другой, несовместимый с делфи формат. Эту библиотеку .lib можно создать из имеющейся dll запуском утилиты impdef.
Еще есть третий вариант динамической линковки. Он наверно самый простой, но дольше работает. Использование функций API LoadLibrary и GetProcAddress.
Если это учебное задание, то вам сначала надо выяснить, какому способу вас обучали и как надо делать.

Добавлено через 3 минуты
Вот что такое студия 2012 ? Неужели нельзя нормально написать? Например у меня в Rad Studio XE есть си-билдер. Это студия какого года?
0
Avazart
Нарушитель
Эксперт С++
7231 / 5403 / 291
Регистрация: 10.12.2010
Сообщений: 23,945
Записей в блоге: 17
25.12.2012, 02:11 #5
Подозреваю что вижуал студия ...

Для того что бы перенести нужно знать "определение" ф-ции, прототип ... т.е. типы параметров,возвращаемое значение, соглашение о вызове.
0
kaban4ig
2 / 2 / 0
Регистрация: 14.12.2010
Сообщений: 37
25.12.2012, 17:48  [ТС] #6
У меня microsoft visual studio. С помощью impdef я создал def файл. Подключаю его к проекту (правой кнопкой по Source Files->Add->Existing item и выбираю созданный .def файл). Но при вызове нужной функции всёравно получаю ошибку.
Код программы
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <stdio.h>
using namespace std;
extern "C" __declspec(dllimport)int CeloeChislo();
int main()
{
    int result=CeloeChiclo();
    return 0;
}
Код длл
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
library Project1;
 
uses
  SysUtils,
  Classes;
 
{$R *.res}
 Function CeloeChislo:integer; cdecl;export;
 var NH:integer;
 begin
 NH:=5;
 Result:=NH*NH;
 
 
 end;
 exports CeloeChislo;
 
begin
end.
Код сделан по примерам с http://ru.wikibooks.org/wiki/DLL Я чегото не доделываю или делаю не правильно?
0
Avazart
Нарушитель
Эксперт С++
7231 / 5403 / 291
Регистрация: 10.12.2010
Сообщений: 23,945
Записей в блоге: 17
25.12.2012, 18:07 #7
http://www.cyberforum.ru/blogs/131347/blog478.html - там в литературе глава из Архангельского

Добавлено через 2 минуты
Цитата Сообщение от kaban4ig Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <stdio.h>
using namespace std;
extern "C" __declspec(dllimport)int CeloeChislo();
int main()
{
 int result=CeloeChiclo();
 return 0;
}
Пробуй сначала динамически ее подгрузить... либ-файл потом будешь лепить...

Dynamic-Link Library: Теория + Практика 2.3. Явная загрузка.
0
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
25.12.2012, 18:10 #8
чтобы загрузить .dll файл:

C++
1
2
3
4
5
6
7
8
#include <windows.h>
 
    HINSTANCE hLib = LoadLibrary(L"dll.dll");
 
    if(hLib == NULL)
        cout << "Unable to load library!" << endl;
    else
        cout << "Succes!" << endl;
для вызова ф-ции из dll

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <windows.h>
 
 
    FARPROC Func = (FARPROC)GetProcAddress((HMODULE)hLib, "CeloeChislo");
 
    if(Func == NULL)
    {
        cout << "Unable to load function(s)." << endl;
        FreeLibrary((HMODULE)hLib);
        _getch();
        return 0;
    }
 
    Func();
    FreeLibrary((HMODULE)hLib);
1
palva
2628 / 1855 / 268
Регистрация: 08.06.2007
Сообщений: 7,088
Записей в блоге: 4
25.12.2012, 18:15 #9
Цитата Сообщение от kaban4ig Посмотреть сообщение
Я чегото не доделываю или делаю не правильно?
Главное - вы опять не даете нам полной информации. Какая ошибка, на каком этапе, какой текст диагностики.
0
kaban4ig
2 / 2 / 0
Регистрация: 14.12.2010
Сообщений: 37
25.12.2012, 18:19  [ТС] #10
Сделал как сказал Afflicted, работает! Спасибо большое всем за помощь.=)
0
25.12.2012, 18:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2012, 18:19
Привет! Вот еще темы с ответами:

Подключение dll (C++) к проекту VB 6.0 - C++
Здравствуйте! Проблемма в подключении ДЛЛ к VB 6. есть библиотека на C++ //ConsoleApplication2.cpp: определяет точку входа для...

Подключение Dll на С++ к Java и С# - C++
Добрый день. Подскажите, пожалуйста куда копать: надо создать DLL на С++ с функциями, структурами и классом так, чтобы её потом можно...

Подключение DLL без заголовка - C++
Здравствуйте. У меня есть dll, написанная на Delphi, нужно использовать ее на c++. У меня нет к ней header'а, но есть decls файл, то есть...

Подключение библиотек lib и dll - C++
Здравствуйте. Подскажите, пожалуйста, как исправить такую ошибку: Ошибка 2 error LNK1104: не удается открыть файл &quot;opencv_core2411.lib&quot;....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru