DLL Visual Studio 2008

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: DLL Visual Studio 2008

Re: DLL Visual Studio 2008

atavin-ta » 13 окт 2009, 11:28

Andrey_06 писал(а):Спасибо за ответ. По поводу замечаний:

функций в библиотеке только одна.


это просто пример, тело функции немного другое, но это, я думаю, не важно.

Если все таки не разберусь конкретно с этим примером, может кто-нибудь еще подскажет решение? Суть в том, чтобы экспортировать в DLL функцию, а затем при работе программы динамически загрузить эту DLL, и получить указатель на функцию из библиотеки. Загрузка DLL происходит в WindowsForms.
Тестовая библиотека? Тогда понятно. Про подозрение в перегрузке имени только из-за самой возможности создавать несколько функций с одним именем я уже писал. Я также указал на то, что сам сомневаюсь. Откомпилируй библиотеку. В каталоге с dll у тебя должен оказаться lib. Это библиотека импорта. Вставь её в проект и весь код, с которымыт сейчас мучаешься и допускаешь неопознанные ошибки будет атоматически вставлен в туда во-первых правильно, а во-вторых не явно. А потом обращаяся к функции прямо так:

Код: Выделить всё

textBox1->Text = Convert::ToString(Add(1,1));
без всей этой возни с загрузкой билиотеки, взятием адреса и проверкой указателей.

Re: DLL Visual Studio 2008

Andrey_06 » 12 окт 2009, 13:25

Спасибо за ответ. По поводу замечаний:
Сколько у тебя функций Add?
функций в библиотеке только одна.
зачем вообще понадобилось стандартный оператор упаковывать в оболочечную функцию?
это просто пример, тело функции немного другое, но это, я думаю, не важно.

Если все таки не разберусь конкретно с этим примером, может кто-нибудь еще подскажет решение? Суть в том, чтобы экспортировать в DLL функцию, а затем при работе программы динамически загрузить эту DLL, и получить указатель на функцию из библиотеки. Загрузка DLL происходит в WindowsForms.

Re: DLL Visual Studio 2008

atavin-ta » 12 окт 2009, 08:31

Сколько у тебя функций Add? Если больше одной, то может быть, приблизительно

Код: Выделить всё

HINSTANCE hModule;
int (*pFunction)(int, int);
(FARPROC &)pFunction;
hModule=::LoadLibrary("MyDLL");
if ( hModule != NULL )
{
 pFunction = GetProcAddress(hModule, "iiAdd");
}
else
{
 pFunction=NULL;
}
if (pFunction != NULL)
{
 textBox1->Text = Convert::ToString(pFunction(1,1));
}
else 
{
 textBox1->Text = Convert::ToString("err");
}
Я не уверен в написании имени перегруженной функции и в том, зависит ли вообще перегрузка имени от числа функиций с таким именем или только от самой возможности создавать более одной. Неуверен, в этом ли вообще глюк, или в чём-то другом. Не знаю, можно ли в товоей библиотеке вообще пергружать функции. Но другого объяснения у меня нет. Попробуй откомпилить в ассемблер тестовую прогу с такого файла:

Код: Выделить всё

int Add(int x, int y)
{
 return x+y;
}
int Add(float x, float y)
{
 return (int)(x+y)
}
int Main ()
{
 int x=1;
 int y=2;
 int z;
 int t;
 float w=2.1;
 float q=3.2;
 z=Add(x,y);
 t=Add(w,q);
}
и найди в полученном файле имя, содержащее ii и Add - это будет точное имя перегруженной функции. Я GetProcAddressом не пользуюсяь, а предпочитаю бибиотеки импорта, то есть специальные статические либы с адресами функций динамических библиотек. Ко всем функцциям библиотек я обращаюсь так, как если бы они были функциями самой прилады, а не биьблиотек. Кстати, зачем вообще понадобилось стандартный оператор упаковывать в оболочечную функцию? разве нельзя писать просто x+y и не мучиться? А если тип слагаемых вдруг будет не стандратный, а какой-нибудь TComlex, то перегрузи оператор сложеия и поинтересуйся, может ли библиотека поставлять операторы-члены класса, или необходимо инкладить все такие операторы непосредственно в приладу. Функции же создавай для тех случаев, для которых операторы не предусмотрены, или для суммы, произведения или конкатенации всех элементов массива.

DLL Visual Studio 2008

Andrey_06 » 11 окт 2009, 18:55

здравствуйте. Помогите с экспортом функций в DLL и их дальнейшим использованием. Код DLL:

Код: Выделить всё

__declspec(dllexport) int Add(int a, int b) {return a+b;}
пытаюсь использовать функцию из DLL:

Код: Выделить всё

HINSTANCE hModule;
hModule=::LoadLibrary("MyDLL");
 if ( hModule != NULL )
	 {
           int (*pFunction)(int, int);				 
           (FARPROC &)pFunction = GetProcAddress(hModule, "Add");
           if (pFunction != NULL)
                 {
	           textBox1->Text = Convert::ToString(pFunction(1,1));
                 }
           else 
                 {
                   textBox1->Text = Convert::ToString("err");
                 }
           }
указатель на функцию всегда NULL. в чем ошибка?

Вернуться к началу