DLL Visual Studio 2008

Модераторы: Romeo, Hawk, Absurd, WinMain, DeeJayC

Ответить
Andrey_06
Сообщения: 5
Зарегистрирован: 15 май 2008, 12:40

DLL Visual Studio 2008

Сообщение Andrey_06 » 11 окт 2009, 17: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. в чем ошибка?

atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

Re: DLL Visual Studio 2008

Сообщение atavin-ta » 12 окт 2009, 07: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, то перегрузи оператор сложеия и поинтересуйся, может ли библиотека поставлять операторы-члены класса, или необходимо инкладить все такие операторы непосредственно в приладу. Функции же создавай для тех случаев, для которых операторы не предусмотрены, или для суммы, произведения или конкатенации всех элементов массива.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".

Andrey_06
Сообщения: 5
Зарегистрирован: 15 май 2008, 12:40

Re: DLL Visual Studio 2008

Сообщение Andrey_06 » 12 окт 2009, 12:25

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

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

atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

Re: DLL Visual Studio 2008

Сообщение atavin-ta » 13 окт 2009, 10:28

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

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


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

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

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

textBox1->Text = Convert::ToString(Add(1,1));
без всей этой возни с загрузкой билиотеки, взятием адреса и проверкой указателей.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".

Ответить