Поиск:

Ответ в темуСоздание новой темы Создание опроса
> переход с VC++60 на VC++2008 проблема с DLL, DLL подключается, а ее функции не подкл 
V
    Опции темы
Dmitriy2k
Дата 2.3.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.11.2005

Репутация: нет
Всего: нет



Я перешел с vc++60 на vc++ 2008

мой проект довольно большой, состоит из exe и нескольких dll

на vc++60 все компилируется без единой ошибки, да и теперь на vc++2008 компилируется без ошибок,
но c работоспособностью dll появились проблемы.

dll подгружается,ошибок нет:

Код


int LoadPluginDll(HINSTANCE *hDll, char *dllName)
{
    *hDll=LoadLibrary(dllName);
    
    if(*hDll==NULL)
    {
       MessageBox(NULL,"Unable to load Plugin library!","ERROR!",MB_OK);
       return -1;
    }
    return 0;
}



А вот функция не подгружается, выдает NULL. в vc60 все работало.


Код



exe
......
{

   (FARPROC &)*PlugProc = GetProcAddress((HMODULE)hDll,"GetInfoPlg");//после этой строчки *PlugProc становится NULL
    
   if(*PlugProc==NULL)
     {
       MessageBox(NULL,"Unable to load Plugin Function!","ERROR!",MB_OK);
       FreeLibrary((HMODULE)hDll);
       return -1;
     }
     return 0;
}

...

А это подключаемая DLL
...
extern "C" __declspec(dllexport) void GetInfoPlg(void)
{
    //*info=pluginfo;
    //plug_number=number;
    return 0;
}



Подскажите, что делать?
PM MAIL   Вверх
Earnest
Дата 2.3.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Проще всего построить map-файл для DLL и найти там истинное имя нужной тебе функции. Map-файл задается в опциях линкера. Ищи подстроку GetInfoPlg и смотри, как она там выглядит. Если есть возможность повторить сборку в 6ке, тоже сделай с map-файлом и посмотри на имя там. Если есть разница, то нужно искать, откуда, если нет, тогда... будем думать дальше...

Но вот увидела такую страсть: 
Код

(FARPROC &)*PlugProc = GetProcAddress(...)
   if(*PlugProc==NULL)

Не знаю, что ты этим хотел сказать и кто такой PlugFunc, но  если это указатель на функцию, то зачем ее разыменовывать?
Напиши просто (только сигнатуру поправь, конечно):
Код

typedef LPVOID (*PFUNC)();
PFUNC pFunc = (PFUNC)GetProcAddress(...);



--------------------
...
PM   Вверх
Dmitriy2k
Дата 2.3.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.11.2005

Репутация: нет
Всего: нет



Спасибо за подсказку про MAP-файл. Попробую.



Цитата(Earnest @  2.3.2009,  16:37 Найти цитируемый пост)
Не знаю, что ты этим хотел сказать и кто такой PlugFunc, но  если это указатель на функцию, то зачем ее разыменовывать?


typedef void (PROC)(void);

int SetAddr( PROC **PlugProc,HINSTANCE hDll, char *procName)
{    
   (FARPROC &)*PlugProc = GetProcAddress(...)
   if(*PlugProc==NULL)
}
 
**PlugProc - двойной указатель, потому что в моей программе подключаются плагины с определенным набором внешних функций. Создается массив структур"плагин",в котором хранятся адреса функций.

устанавливаю адреса функций следующим образом:

result=SetAddr(&(&PlugIns[numPlug])->GetInfo,PlugIns[numPlug].hPluginDll,"GetInfoPlg");
Заморочено конечно но работает стабильно( по крайней мере в VC6).
Не будем углубляться в программу, уже все написано.

Я сейчас пишу плагины(DLL) на VC2008,на которые моя программа "плюется", а конкретно, на имена функций.



PM MAIL   Вверх
ИванМ
Дата 2.3.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: нет
Всего: 23



У меня тоже была похожая проблема. На VS2005 делал dll. VS2005 работала с ним. И ассемблер ее понимал. А VS2008 не понимала. После того как я перекомпилил dll на VS2008 студия стала его понимать. В чем была проблемма я так и не понял.
PM MAIL   Вверх
Dmitriy2k
Дата 4.3.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.11.2005

Репутация: нет
Всего: нет



я сделал тестовый проект на VC2008 (никак не связанный с моей программой),
содержащий usemydll.exe и mydll.dll
exe-шник подключает dll
компилируются без ошибок.

.....

сгенерировал MAP-файлы и сверил имена импортируемой и экспортируемой функции... ничего не сходится.
В общем после долгих стараний они сошлись. Функция заработала.

в прикрепленном ехешнике мой пример.

Запускаем в моем примере меню "File->usemydll"
запускается функция из dll и выводит MessageBox
....
на моем компе оно работает, а на чужом вообще не замускается - пишет дескать приложение некорректно настроено..переустановите. попробую сишные dll-ки скопировать.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  usedll.zip 76,99 Kb
PM MAIL   Вверх
Earnest
Дата 4.3.2009, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



На счет работы на другом компе - это с твоей проблемой совсем не связано; конечно, нужно с собой dll таскать, MFC и CRT и может, еще какие-то. Посмотри список зависимостей.


--------------------
...
PM   Вверх
Dmitriy2k
Дата 5.3.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.11.2005

Репутация: нет
Всего: нет



В общем я разочарован. VC2008 заточен под VISTA. Ну не хочу чтобы моя программа имела минимальные требования WINDOWS VISTA. Может конечно я что то не понимаю, но программировать я буду на VC6.
PM MAIL   Вверх
Earnest
Дата 5.3.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Лучше тогда на 2003. Вполне себе работает со всеми виндоусами, начиная с 95 (только за совместимостью смотреть надо самому). А серда и сам язык получше, да и библиотеки (MFC \ STL).
Чувства насчет ВИСТЫ вполне разделяю. smile

Добавлено через 4 минуты и 39 секунд
Но, конечно, библиотеки все равно таскать нужно (это только библиотеки от 6-ки везде понапиханы)


--------------------
...
PM   Вверх
dizzy1984
Дата 5.3.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Цитата(Dmitriy2k @  5.3.2009,  15:28 Найти цитируемый пост)
 VC2008 заточен под VISTA

Откуда инфа?
PM MAIL   Вверх
Dmitriy2k
Дата 9.3.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.11.2005

Репутация: нет
Всего: нет



Я к сожалению плохо понимаю программирование под .NET, которая требуется для программ под VC2008, в XP ее нет. В висте, я уверен уже все включено и будет работать на ура.
Кучу dll таскать не хочется

PM MAIL   Вверх
Firexel
Дата 9.3.2009, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 21.6.2008

Репутация: нет
Всего: нет



Цитата
Кучу dll таскать не хочется
 
Сделай статическую компоновку. Библиотеки будут встроены в экзешник. 
PM MAIL WWW ICQ Jabber   Вверх
just_geek
Дата 10.3.2009, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 13.12.2007

Репутация: нет
Всего: 10



Цитата

Я к сожалению плохо понимаю программирование под .NET, которая требуется для программ под VC2008, в XP ее нет.

Да никакой .NET не требуется для запуска программы написанной на VC++ 2008.

Все что необходимо это 3 библиотеи: msvcr90.dll, msvcp90.dll, msvcm90.dll и манифест  (Если MFC и ATL не используешь). Если не используешь STL, то уже требуется только одна msvcr90.dll. Ну и Firexel правильно сказал, если изменить опцию /MD на /MT, то эти библиотеки будут линковаться статически. Либо скачать vcredist_x86.exe для VC++ 2008 размером 1.7 мб (по крайней мере в составе Express Edition его нету) и распростронять вместе с программой. Ибо он правильно поставит все библиотеки используя Side-by-side кэш.

И еще, не уверен, но возможно, что минимальные требования для программы написанной на vc++ 2008 будет Windows XP.
PM MAIL   Вверх
nerezus
Дата 10.3.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



Цитата

И еще, не уверен, но возможно, что минимальные требования для программы написанной на vc++ 2008 будет Windows XP.
 Нет. По крайней мере на чистом win2000 SP 3 пахало =)


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0540 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.