Программа во время исполнения обращается к динамической библиотеке, т.е. для нормальной работы экзешника необходимо присутствие данной dll-ки. Но из библиотеки тянется всего одна малюсенькая функция. Мне кажется было бы практичней импортировать эту функцию из dll-ки. Кто может сказать как это сделать или куда обратиться за информацией просьба помочь.
С уважением.
Ok, зайду с другой стороны, как добиться, чтобы во время исполнения программа не требовала dll-ку?
Здравствуйте, SubZero2000, Вы писали:
SZ>Ok, зайду с другой стороны, как добиться, чтобы во время исполнения программа не требовала dll-ку?
Смотреть в сторону dynamic/delay loading. В обоих случаях при запуске dll-ка не требуется. В первом — нужно самомоу подгружать dll в рантайме, во втором — за тебя это сделает сам рантайм, но заплатишь размером (вроде) + платформно-зависимое решение, кажется.
Здравствуйте, Kaa, Вы писали:
Kaa>Здравствуйте, SubZero2000, Вы писали:
Kaa>http://www.rsdn.ru/article/?baseserv/dlluse.xmlАвтор(ы):
Александр Шаргин
В статье рассматривается три способа подключения DLL к программе на Visual C++ — неявное подключение (implicit linking), явное подключение (explicit linking) и отложенная загрузка (delayed load) DLL. Для каждого способа демонстрируется использование переменной, функции и класса из подключаемой DLL. В разделе об отложенной загрузке также приводится дополнительная информация (описание обработки исключений и использования функций-ловушек).
Спасибо огромное статья очень хорошая, но как я понял явное, неявное и отложенное подключение dll требуют во время исполнения программы эту самую dll, а иначе — цитирую: если требуемая DLL не обнаружена, приложение аварийно завершается.
В том то вся и фишка, что я хочу, чтобы во время линковки одна из функций в dll была вытянута оттуда и сама библиотека больше не понадобилась бы.
С уважением.
Здравствуйте, SubZero2000, Вы писали:
SZ>Спасибо огромное статья очень хорошая, но как я понял явное, неявное и отложенное подключение dll требуют во время исполнения программы эту самую dll, а иначе — цитирую: если требуемая DLL не обнаружена, приложение аварийно завершается.
SZ>В том то вся и фишка, что я хочу, чтобы во время линковки одна из функций в dll была вытянута оттуда и сама библиотека больше не понадобилась бы.
Посмотри Dll2Lib
http://www.binary-soft.com/dll2lib/dll2lib.htm
Возможные грабли — DLL инициализирует runtime переменные в DllMain которые потом используются в нужной функции.
Здравствуйте, Kaa, Вы писали:
Kaa>Здравствуйте, SubZero2000, Вы писали:
Kaa>...
#pragma comment(lib, "LIB.lib")
#pragma comment(lib, "Delayimp.lib")
#pragma comment(linker, "/Delay:unload")
#pragma comment(linker, "/DELAYLOAD:LIB.dll")
#include "StdAfx.h"
#include "CCLASS.h"
#include "LIB.h"
#include <Delayimp.h>
LONG CCLASS::DelayLoadFilter(DWORD code)
{
switch(code){
case VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND):
case VcppException(ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND):
return EXCEPTION_EXECUTE_HANDLER;
}
return EXCEPTION_CONTINUE_SEARCH;
}
int CCLASS::Method(string* outStr)
{
int iResult = 1;
__try
{
iResult = libMethod(outStr);
__FUnloadDelayLoadedDLL2("LIB.dll");
}
__except(DelayLoadFilter(GetExceptionCode())){
switch(GetExceptionCode()){
case VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND):{
//"DLL not found";
iResult = -1;
break;
}
case VcppException(ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND):{
//"Function in DLL not found";
iResult = -1;
break;;
}
}
}
return iResult;
}
Кто-нибудь может подсказать, почему компиляция вышеследующего кода выдаёт ошибку типа: error C2712: Cannot use __try in functions that require object unwinding.
Заранее спасибо.
С уважением.
Здравствуйте, SubZero2000, Вы писали:
SZ>почему компиляция вышеследующего кода выдаёт ошибку типа: error C2712: Cannot use __try in functions that require object unwinding.
исторически SEH был придуман для использования в языке C. Из C++ его использовать можно, но не рекоммендовано. У C++ есть свой способ обработки исключительных ситуаций, который учитывает всю специфику языка (например, наличие нетривиальных деструкторов у объектов). В С++ же использовать SEH можно в том коде, который ен содержит некоторых специфичных для C++ участков, таких как, например, раскрутка стэка в случае возникновения исключений.
Борятся, например, расставляя хэндлеры в таких функциях, которые являются заглушками, передающими параметры простых типов типа С-шных структур, скалярных типов, типов, не требующих специальной очистки, и указателей, в функции, которые могут что-то делать. Тогда раскрутка стека находится в другом месте, и хэндлер нормально устанавливается.