Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2011, 01:37   #1
NapalmRain
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 53
Восклицание Чтение функций из динамически подгруженной dll

Суть проблемы в следующем: раньше в работе не приходилось использовать dll, а сейчас вот пришлось. Научился создавать dll и загружать их в проект следующим образом
Код:
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
HMODULE Lib;
Lib = LoadLibrary("mydll.dll");
}
Pltcm ничего сложного. Но не могу понять как теперь из неё вытащить мою функцию.

На форумах находил следующие примеры:
Код:
linerb1=(LINERB1 *)GetProcAddress(DllHandle,"_linerb1");
Компилятор говорит, что он не знает что такое linerb1. Оно и понятно. Надо как-то эту переменную сначала объявить. Но вов тут-то и кроется сама проблема, чтьо на всех сайтах что я нашёл нигде не описывается как эта переменная задаётся. Что это за тип, класс..

Если не сложно, не могли бы привести мне буквально пару строчет рабочего кода, что бы я смог дальше разобраться, как мне извлечь из моей dll мои злощастные функиции linerb1, linerb2 и так далее...

Заранее благодарен.

Последний раз редактировалось NapalmRain; 26.01.2011 в 01:38. Причина: ошибка в коде
NapalmRain вне форума Ответить с цитированием
Старый 26.01.2011, 01:43   #2
NapalmRain
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 53
По умолчанию

Прошу простить. Забыл указать. Работаю в с++ builder.
NapalmRain вне форума Ответить с цитированием
Старый 26.01.2011, 04:22   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Первая ссылка в гугле: http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Тип переменной - указатель на функцию.
p51x вне форума Ответить с цитированием
Старый 26.01.2011, 12:12   #4
NapalmRain
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 53
По умолчанию

Примного балгодарен.. Пора уже взять в привычку гуглить... Яндекс мне ничего хорошего не нашёл.
Думаю. дальше уже разбирусь)
NapalmRain вне форума Ответить с цитированием
Старый 26.01.2011, 13:56   #5
NapalmRain
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 53
По умолчанию

Ну чтож. Вынужден вновь обратиться за помощью.
Так как у меня к сожаленью ничего не получилось.

Вот опишу точно свой код

Вот сама dll
Код:
//---------------------------------------------------------------------------
#include <ComObj.hpp>
#include <utilcls.h>
#include <vcl.h>
#include <clx.h>
#include <windows.h>
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------
__declspec (dllexport) double linerb1(double s1, double s2, double s3, double s4, int n)
{
double b1;
        return b1=(s1*s2-n*s3)/(s1*s1-n*s4);
}

__declspec (dllexport) double linerb0(double s1, double s2, double b1, int n)
{
double b0;
        return b0=(s2-b1*s1)/n;
}
Заголовочного файла к ней не писал.

Вот программа, что пыатется её вызвать.
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#include "windows.h"
#include<stdlib.h>                                              
#include<string.h>
#include <vcl.h>
#pragma hdrstop
#include "Unit11.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMODULE Lib;
LPCSTR linerb1;
double x,y1,yy1,yy2,y2,s1=0,s21=0,s31=0,s4=0,s22=0,s32=0,imax,b11,b01,b12,b02;
imax=StringGrid1->RowCount;
AnsiString tmp;
for (int i=0;i<imax;i++) {
tmp=StringGrid1->Cells[0][i];
x=tmp.ToDouble();
tmp=StringGrid1->Cells[1][i];
y1=tmp.ToDouble();
tmp=StringGrid1->Cells[2][i];
y2=tmp.ToDouble();
s1+=x;
s21+=y1;
s22+=y2;
s31+=x*y1;
s32+=x*y2;
s4+=x*x;
}
Lib=LoadLibrary("1.dll");
linerb1=(char*)GetProcAddress(Lib,"_linerb1");
b11=linerb1(s1,s21,s31,s4,imax);
}
Это не мой основной проект. Это код програмки. которую я создал просто чтоб разобраться с работой с dll на примере просто линейной регрессии.

Прошу знающих людей объяснить, где моя ошибка.
NapalmRain вне форума Ответить с цитированием
Старый 26.01.2011, 14:18   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

на какой строке выдает ошибку? или вылетает, или что?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.01.2011, 14:42   #7
NapalmRain
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 53
По умолчанию

выдаёт ошибку
Код:
[C++ Error] Unit11.cpp(81): E2314 Call of nonfunction
в строке
Код:
b11=linerb1(s1,s21,s31,s4,imax);
NapalmRain вне форума Ответить с цитированием
Старый 26.01.2011, 14:45   #8
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Если возникают ошибки при подключении DLL возможна проблема в декодировании имен функций. С помощью программы Dependency проверь имена. Ссылка.

Последний раз редактировалось profi; 26.01.2011 в 14:47.
profi вне форума Ответить с цитированием
Старый 26.01.2011, 14:55   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

проблема хуже...

вы обьявили какой тип у linerb1?
а надо тип указателя на функцию.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.01.2011, 14:57   #10
NapalmRain
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 53
По умолчанию

выдал следующее название функции
вместо linerb1 - @linerb1$qddddi
но вставив это в код, проблема не решилась.
Однако благодарю за совет. программа полезная в дальнейшем пригодится.
NapalmRain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Список функций .dll Johnson Общие вопросы Delphi 2 21.12.2010 17:10
Переадресация функций DLL Bad-XxX Общие вопросы Delphi 0 13.10.2010 01:11
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36
Несколько функций в DLL Alex Cones Общие вопросы Delphi 7 23.05.2009 22:36
Получение функций из DLL NITRON Общие вопросы Delphi 8 12.09.2007 17:32