Импорт функции из dll-ки?
От: SubZero2000 Украина  
Дата: 12.05.03 14:46
Оценка:
Программа во время исполнения обращается к динамической библиотеке, т.е. для нормальной работы экзешника необходимо присутствие данной dll-ки. Но из библиотеки тянется всего одна малюсенькая функция. Мне кажется было бы практичней импортировать эту функцию из dll-ки. Кто может сказать как это сделать или куда обратиться за информацией просьба помочь.
С уважением.
(с)(_SZ_)
Re: Импорт функции из dll-ки?
От: SubZero2000 Украина  
Дата: 12.05.03 15:39
Оценка:
Ok, зайду с другой стороны, как добиться, чтобы во время исполнения программа не требовала dll-ку?
(с)(_SZ_)
Re[2]: Импорт функции из dll-ки?
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 12.05.03 16:51
Оценка:
Здравствуйте, SubZero2000, Вы писали:

SZ>Ok, зайду с другой стороны, как добиться, чтобы во время исполнения программа не требовала dll-ку?


Смотреть в сторону dynamic/delay loading. В обоих случаях при запуске dll-ка не требуется. В первом — нужно самомоу подгружать dll в рантайме, во втором — за тебя это сделает сам рантайм, но заплатишь размером (вроде) + платформно-зависимое решение, кажется.
Алексей Кирдин
Re: Импорт функции из dll-ки?
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 12.05.03 16:53
Оценка:
Здравствуйте, SubZero2000, Вы писали:

http://www.rsdn.ru/article/?baseserv/dlluse.xml
Автор(ы):
Александр Шаргин


В статье рассматривается три способа подключения DLL к программе на Visual C++ — неявное подключение (implicit linking), явное подключение (explicit linking) и отложенная загрузка (delayed load) DLL. Для каждого способа демонстрируется использование переменной, функции и класса из подключаемой DLL. В разделе об отложенной загрузке также приводится дополнительная информация (описание обработки исключений и использования функций-ловушек).
Алексей Кирдин
Re[2]: Импорт функции из dll-ки?
От: SubZero2000 Украина  
Дата: 13.05.03 08:56
Оценка:
Здравствуйте, 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 была вытянута оттуда и сама библиотека больше не понадобилась бы.

С уважением.
(с)(_SZ_)
Re[3]: Импорт функции из dll-ки?
От: Аноним  
Дата: 13.05.03 09:13
Оценка:
Здравствуйте, SubZero2000, Вы писали:

SZ>Спасибо огромное статья очень хорошая, но как я понял явное, неявное и отложенное подключение dll требуют во время исполнения программы эту самую dll, а иначе — цитирую: если требуемая DLL не обнаружена, приложение аварийно завершается.


SZ>В том то вся и фишка, что я хочу, чтобы во время линковки одна из функций в dll была вытянута оттуда и сама библиотека больше не понадобилась бы.


Посмотри Dll2Lib http://www.binary-soft.com/dll2lib/dll2lib.htm
Возможные грабли — DLL инициализирует runtime переменные в DllMain которые потом используются в нужной функции.
Re[2]: Импорт функции из dll-ки?
От: SubZero2000 Украина  
Дата: 13.05.03 10:57
Оценка:
Здравствуйте, 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.

Заранее спасибо.
С уважением.
(с)(_SZ_)
Re[3]: Импорт функции из dll-ки?
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 13.05.03 11:38
Оценка:
Здравствуйте, SubZero2000, Вы писали:

SZ>почему компиляция вышеследующего кода выдаёт ошибку типа: error C2712: Cannot use __try in functions that require object unwinding.

исторически SEH был придуман для использования в языке C. Из C++ его использовать можно, но не рекоммендовано. У C++ есть свой способ обработки исключительных ситуаций, который учитывает всю специфику языка (например, наличие нетривиальных деструкторов у объектов). В С++ же использовать SEH можно в том коде, который ен содержит некоторых специфичных для C++ участков, таких как, например, раскрутка стэка в случае возникновения исключений.

Борятся, например, расставляя хэндлеры в таких функциях, которые являются заглушками, передающими параметры простых типов типа С-шных структур, скалярных типов, типов, не требующих специальной очистки, и указателей, в функции, которые могут что-то делать. Тогда раскрутка стека находится в другом месте, и хэндлер нормально устанавливается.
Алексей Кирдин
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.