Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Подключение DLL на Visual C++  (Прочитано 18096 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Ninetta
Новенький

ru
Offline Offline
Пол: Женский

« : 30-03-2010 19:36 » 

У меня есть только файлы dll и lib, и то lib сгенерирован из dll с помощью программы Dll2Lib, h-файла нету. Хочу подключить библиотеку неявно, скажите, такое подключение может работать?
#pragma comment(lib, "NeuroNet.lib")

У меня почему-то не работает, походу не видит библиотеку, не отображает её в ClassView. А может просто функции не так вызываю...

Пробовала подключить через Project -> Linker -> Input -> Additional Dependencies, всё равно библиотеку не видит.
Может дело в том, что нету h-файла? Тогда вопрос - как его получить??

Или я просто что-то не правильно делаю?

И как пользоваться функциями из dll?

Заранее спасибо!
« Последнее редактирование: 31-03-2010 03:46 от Алексей1153++ » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 31-03-2010 06:26 » 

А ты уверена, что эта dll вобще экспортирует ф-ции? Это может быть например библиотека расширения MFC, библиотека ресурсов и тд и тп.

Ты можешь загружать эту dll динамически?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 31-03-2010 07:17 » 

Цитата: Ninetta
#pragma comment(lib, "NeuroNet.lib")

Библиотека после этого нормально линкуется.

Цитата: Ninetta
И как пользоваться функциями из dll?

Для начала не мешало бы объявить функцию


А вообще, без исходника, это всё равно, что искать черную кошку, сама знаешь где. Не понятно, что объявила, что не объявила, что вызываешь и т.д.
Записан
Денисrf
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 02-04-2010 19:02 » 

Это код ДЛЛ моей:


Код:
#include "stdafx.h"
#include "tchar.h"
#include <Dbt.h>
#include <setupapi.h>




extern __declspec(dllexport)LRESULT CALLBACK Function(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
//MSG msg;
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR) lParam;
switch (uiMsg)
  {
    case WM_DEVICECHANGE:
    {
       
 
  switch (wParam)
      {
        case DBT_DEVICEARRIVAL:
          MessageBox(hWnd,_T("A device has been inserted."), _T("USB Notice"), MB_OK);
        break; 
 
        case DBT_DEVICEREMOVECOMPLETE:
          MessageBox(hWnd, _T("A device has been removed."), _T("USB Notice"), MB_OK);
        break;
      } 
 
    default:
      return DefWindowProc(hWnd, uiMsg, wParam, lParam);
    break;
  }
}
  return 0;
}

Это код файла подключения:

Код:
HINSTANCE hHookDll;
if ((hHookDll = LoadLibrary(_T("c:\\DllUSB_Conf.dll")))==NULL)
{
std::cout<<"Oshibka podkluchenia .DLL"<<std::endl;

_getch();
return 0;
}

.
.
.

Код:
void (*pFunction)(HWND, UINT, WPARAM, LPARAM);


(FARPROC &)pFunction=GetProcAddress(hHookDll,"?Function@@YGJHIJ@Z");

if (!pFunction)
{
std::cout<<"Oshibka podkluchenia .DLL adres funkcii ne poluchen"<<std::endl;

FreeLibrary(hHookDll);
_getch();
return 0;
}

Ошибка: Oshibka podkluchenia .DLL adres funkcii ne poluchen

В чем я не прав?

Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 02-04-2010 19:17 » 

Это что троллинг чтоли?

Ведь видно же в каком месте, после вызова какой функции, возникает сообщение об ошибке. И раз дело дошло до нее, то 1й параметр точно нормальный. Значит дело во 2м.
Но можно было бы вообще обойтись без таких рассуждений, достаточно взглянуть на имя функции. Видимо это функция из либы, которая валялась на компакт-диске с драйверами на доширак
Записан
Денисrf
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 03-04-2010 10:44 » 

Нет не троллинг.

Ведь видно же в каком месте, после вызова какой функции, возникает сообщение об ошибке. И раз дело дошло до нее, то 1й параметр точно нормальный. Значит дело во 2м.

Это я и сам понимаю, только не пойму почему функция не вытаскивается. Ни так ?Function@@YGJHIJ@Z не так Function.
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 03-04-2010 10:53 » 

 А как называется функция которую ты хочешь подключить?
Записан
Денисrf
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 03-04-2010 15:27 » 

extern __declspec(dllexport)LRESULT CALLBACK Function(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) Примо из VC копировал.
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
darkelf
Молодой специалист

nl
Offline Offline

« Ответ #8 : 03-04-2010 16:17 » 

extern __declspec(dllexport)LRESULT CALLBACK Function(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) Примо из VC копировал.
Возможно Вы всё-таки задаёте неправильное имя, у меня для __declspec(dllexport)LRESULT CALLBACK Function(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) получилось имя отличное от Вашего - "?Function@@YGJPAUHWND__@@IIJ@Z" в msvc6.0.

следующий код у меня работает:
Код:
/*библиотека: q2.cpp*/
#include <windows.h>
         
__declspec(dllexport)LRESULT CALLBACK Function(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
  return 2;
}

/*приложение: q3.c*/
#include <windows.h>
#include <stdio.h>

int main(int argc, char* argv[])
{ HINSTANCE hHookDll;
  LRESULT (CALLBACK  *pFunction)(HWND, UINT, WPARAM, LPARAM);

  if ((hHookDll = LoadLibrary("q2.dll"))==NULL)
  { printf("nodll\n");
    return 1;
  }
  (void*)pFunction=(void*)GetProcAddress(hHookDll,"?Function@@YGJPAUHWND__@@IIJ@Z");
  if (pFunction == NULL)
  { printf("nofunc\n");
    return 1;
  }
  else
    printf("func=%d\n", pFunction(0, 0, 0, 0));
  return 0;
}

как и ожидалось, вызов отрабатывает нормально:

Код:
E:\>q3.exe
func=2
E:\>

Записан
Денисrf
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 04-04-2010 05:05 » 

Да у меня тоже работает. Спасибо. Вот на сто удов был уверен что линковщик имя искаверкал. А как узнать на какое имя он меняет имя функции?

P.S.
Христос воскрес, коллеги!
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
darkelf
Молодой специалист

nl
Offline Offline

« Ответ #10 : 06-04-2010 05:02 » 

Да у меня тоже работает. Спасибо. Вот на сто удов был уверен что линковщик имя искаверкал. А как узнать на какое имя он меняет имя функции?

P.S.
Христос воскрес, коллеги!
Я посмотрел depends-ом.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 06-04-2010 06:15 » 

А ведь казалось бы... Поиском, да по форуму.

https://forum.shelek.ru/index.php/topic,15875.msg218971.html#msg218971

extern "C" перед каждой экспортируемой ф-ей, или же просто взять все ф-ции в extern "C" { объявление ф-ций }, и всё будет в порядке.

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
darkelf
Молодой специалист

nl
Offline Offline

« Ответ #12 : 06-04-2010 08:24 » 

А ведь казалось бы... Поиском, да по форуму.

https://forum.shelek.ru/index.php/topic,15875.msg218971.html#msg218971

extern "C" перед каждой экспортируемой ф-ей, или же просто взять все ф-ции в extern "C" { объявление ф-ций }, и всё будет в порядке.
такой вариант я тоже пробовал, но задача была для текущего варианта функции.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 06-04-2010 11:41 » new

При таком кривом имени, имеет смысл импортировать по орденалу
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines