Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > переход с VC++60 на VC++2008 проблема с DLL


Автор: Dmitriy2k 2.3.2009, 16:23
Я перешел с 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;
}



Подскажите, что делать?

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

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

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

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

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

Автор: Dmitriy2k 2.3.2009, 18:03
Спасибо за подсказку про 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,на которые моя программа "плюется", а конкретно, на имена функций.



Автор: ИванМ 2.3.2009, 19:37
У меня тоже была похожая проблема. На VS2005 делал dll. VS2005 работала с ним. И ассемблер ее понимал. А VS2008 не понимала. После того как я перекомпилил dll на VS2008 студия стала его понимать. В чем была проблемма я так и не понял.

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

.....

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

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

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

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

Автор: Dmitriy2k 5.3.2009, 13:28
В общем я разочарован. VC2008 заточен под VISTA. Ну не хочу чтобы моя программа имела минимальные требования WINDOWS VISTA. Может конечно я что то не понимаю, но программировать я буду на VC6.

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

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

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

Откуда инфа?

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

Автор: Firexel 9.3.2009, 18:23
Цитата
Кучу dll таскать не хочется
 
Сделай статическую компоновку. Библиотеки будут встроены в экзешник. 

Автор: just_geek 10.3.2009, 09:06
Цитата

Я к сожалению плохо понимаю программирование под .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.

Автор: nerezus 10.3.2009, 13:54
Цитата

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)