+ Ответить в теме
Показано с 1 по 4 из 4

Тема: DLL Visual Studio 2008

  1. #1
    Andrey_06 is on a distinguished road
    Регистрация
    15.05.2008
    Возраст
    29
    Сообщений
    5
    Вес репутации
    0

    По умолчанию DLL Visual Studio 2008

    здравствуйте. Помогите с экспортом функций в DLL и их дальнейшим использованием. Код DLL:
    Код cpp:
    1. __declspec(dllexport) int Add(int a, int b) {return a+b;}

    пытаюсь использовать функцию из DLL:

    Код cpp:
    1. HINSTANCE hModule;
    2. hModule=::LoadLibrary("MyDLL");
    3.  if ( hModule != NULL )
    4.      {
    5.            int (*pFunction)(int, int);               
    6.            (FARPROC &)pFunction = GetProcAddress(hModule, "Add");
    7.            if (pFunction != NULL)
    8.                  {
    9.                textBox1->Text = Convert::ToString(pFunction(1,1));
    10.                  }
    11.            else
    12.                  {
    13.                    textBox1->Text = Convert::ToString("err");
    14.                  }
    15.            }

    указатель на функцию всегда NULL. в чем ошибка?
    Последний раз редактировалось Romeo; 12.10.2009 в 23:19. Причина: Используй [code=cpp][/code]

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    system architect atavin-ta is an unknown quantity at this point
    Регистрация
    30.01.2009
    Возраст
    41
    Сообщений
    572
    Вес репутации
    0

    По умолчанию Re: DLL Visual Studio 2008

    Сколько у тебя функций Add? Если больше одной, то может быть, приблизительно
    Код cpp:
    1. HINSTANCE hModule;
    2. int (*pFunction)(int, int);
    3. (FARPROC &)pFunction;
    4. hModule=::LoadLibrary("MyDLL");
    5. if ( hModule != NULL )
    6. {
    7.  pFunction = GetProcAddress(hModule, "iiAdd");
    8. }
    9. else
    10. {
    11.  pFunction=NULL;
    12. }
    13. if (pFunction != NULL)
    14. {
    15.  textBox1->Text = Convert::ToString(pFunction(1,1));
    16. }
    17. else
    18. {
    19.  textBox1->Text = Convert::ToString("err");
    20. }
    Я не уверен в написании имени перегруженной функции и в том, зависит ли вообще перегрузка имени от числа функиций с таким именем или только от самой возможности создавать более одной. Неуверен, в этом ли вообще глюк, или в чём-то другом. Не знаю, можно ли в товоей библиотеке вообще пергружать функции. Но другого объяснения у меня нет. Попробуй откомпилить в ассемблер тестовую прогу с такого файла:
    Код cpp:
    1. int Add(int x, int y)
    2. {
    3.  return x+y;
    4. }
    5. int Add(float x, float y)
    6. {
    7.  return (int)(x+y)
    8. }
    9. int Main ()
    10. {
    11.  int x=1;
    12.  int y=2;
    13.  int z;
    14.  int t;
    15.  float w=2.1;
    16.  float q=3.2;
    17.  z=Add(x,y);
    18.  t=Add(w,q);
    19. }
    и найди в полученном файле имя, содержащее ii и Add - это будет точное имя перегруженной функции. Я GetProcAddressом не пользуюсяь, а предпочитаю бибиотеки импорта, то есть специальные статические либы с адресами функций динамических библиотек. Ко всем функцциям библиотек я обращаюсь так, как если бы они были функциями самой прилады, а не биьблиотек. Кстати, зачем вообще понадобилось стандартный оператор упаковывать в оболочечную функцию? разве нельзя писать просто x+y и не мучиться? А если тип слагаемых вдруг будет не стандратный, а какой-нибудь TComlex, то перегрузи оператор сложеия и поинтересуйся, может ли библиотека поставлять операторы-члены класса, или необходимо инкладить все такие операторы непосредственно в приладу. Функции же создавай для тех случаев, для которых операторы не предусмотрены, или для суммы, произведения или конкатенации всех элементов массива.
    Последний раз редактировалось atavin-ta; 12.10.2009 в 07:54.
    Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
    Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".

  4. #3
    Andrey_06 is on a distinguished road
    Регистрация
    15.05.2008
    Возраст
    29
    Сообщений
    5
    Вес репутации
    0

    По умолчанию Re: DLL Visual Studio 2008

    Спасибо за ответ. По поводу замечаний:
    Сколько у тебя функций Add?
    функций в библиотеке только одна.

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

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

  5. #4
    system architect atavin-ta is an unknown quantity at this point
    Регистрация
    30.01.2009
    Возраст
    41
    Сообщений
    572
    Вес репутации
    0

    По умолчанию Re: DLL Visual Studio 2008

    Цитата Сообщение от Andrey_06 Посмотреть сообщение
    Спасибо за ответ. По поводу замечаний:

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


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

    Если все таки не разберусь конкретно с этим примером, может кто-нибудь еще подскажет решение? Суть в том, чтобы экспортировать в DLL функцию, а затем при работе программы динамически загрузить эту DLL, и получить указатель на функцию из библиотеки. Загрузка DLL происходит в WindowsForms.
    Тестовая библиотека? Тогда понятно. Про подозрение в перегрузке имени только из-за самой возможности создавать несколько функций с одним именем я уже писал. Я также указал на то, что сам сомневаюсь. Откомпилируй библиотеку. В каталоге с dll у тебя должен оказаться lib. Это библиотека импорта. Вставь её в проект и весь код, с которымыт сейчас мучаешься и допускаешь неопознанные ошибки будет атоматически вставлен в туда во-первых правильно, а во-вторых не явно. А потом обращаяся к функции прямо так:
    Код cpp:
    1. textBox1->Text = Convert::ToString(Add(1,1));
    без всей этой возни с загрузкой билиотеки, взятием адреса и проверкой указателей.
    Последний раз редактировалось atavin-ta; 13.10.2009 в 10:36.
    Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
    Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".

+ Ответить в теме

Похожие темы

  1. Использование DataGridView в Visual Studio 2008
    Здравствуйте! В Visual Studio 2008 есть элемент управления "DataGridView". С его помощью можно добавить колонки в необходимом количестве (add...
    от Vaseninbox в разделе MS Office и VB(A).
  2. Новичок по Visual Basic 2008
    Я через 2 недели начинаю учится на програмиста в Дании, но так как ничего не знаю на данный момент про програмирывание кроме азов по html коду, решил...
    от Datamatiker в разделе Вопрошайка
  3. Руский ввод в Microsoft Visual Studio 2008
    Уважаемые программисты, пользователи форума, помогите разобраться. Я вводил код в Visual Studio 2008-ой, и у меня не работает русский ввод. ...
    от Я_Ян в разделе C и C++
  4. настройка Visual Studio 2008
    Привет всем. Подскажите, как можно сделать, чтобы в solution explorer выделялся класс (или другой файл), который в данный момент активен.. Спасибо.
    от villyz в разделе Вопрошайка
  5. PostgreSQL & Visual C++ (VS 2008)
    Кто-нибудь знает, как заставить работать libpq в vc++ 2008? Код: #include "C:\Program Files\PostgreSQL\8.2\include\libpq-fe.h" class a { //...
    от SpiritMS в разделе C и C++

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения