Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> libdl в windows 
:(
    Опции темы
t_gran
Дата 12.5.2008, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



  Хочу поделиться своей проблемой и думаю найду ответ на неё.
  Начнём с того, что я сторонник кросс-платформенности и в какой-то момент решил написать приложение которое может подгружать динамические библиотеки. Т.к. в основной своей массе пишу под *nix-ы естественно начал использовать libdl, а именно 4-замечательный функции описанные в заголовочнике dlfcn.h: dlopen, dlclose, dlsym, dlerror.
  Когда начал портировать программу в windows встала такая проблемка, что libdl просто нет. Я естественно в инет, но то ли я ссыщик токой, то ли действительно этот вопрос мало кого волнует, в общем ничего определённого я там не нашёл. Короче решил я по быстрому сам наклепать эту злощасную либу. Короче вот, что у меня получилось.  Выкладываю просто ради того, что может кто нибудь мне поможет её доработать:
dlfcn.h
Код

/* dlfcn.h
 * by t_gran
 */

#ifndef _DLFCN_H_
#define _DLFCN_H_

#define RTLD_LAZY       1
#define RTLD_NOW        2
#define RTLD_MODEMASK   0x3
#define RTLD_GLOBAL     0x100
#define RTLD_LOCAL      0
#define RTLD_TRACE      0x200

#define RTLD_DI_LINKMAP       2
#define RTLD_DI_SERINFO       4
#define RTLD_DI_SERINFOSIZE   5
#define RTLD_DI_ORIGIN        6
#define RTLD_DI_MAX           RTLD_DI_ORIGIN

#define RTLD_NEXT    ((void *) -1)
#define RTLD_DEFAULT ((void *) -2)
#define RTLD_SELF    ((void *) -3)

void *dlopen (const char *, int);
int dlclose (void *);
const char *dlerror (void);
void *dlsym (void *, const char *);

#endif // _DLFCN_H_


И сам исходник dlfcn.c
Код

#include<windows.h>
#include "dlfcn.h"

//----------------------------------------------//
void *dlopen (const char *inDll, int inMode)
{
   HINSTANCE hint;
   if (inDll == NULL)
   {
      return GetWindowWord (NULL, GWL_HINSTANCE);
   }
   hint= LoadLibrary (inDll);
   if (hint < HINSTANCE_ERROR)
   {
      return NULL;
   }
   return hint;
}
//----------------------------------------------//
int dlclose (void *inHDll)
{
   FreeLibrary ((HINSTANCE) inHDll);
   return 0;
}
//----------------------------------------------//
const char *dlerror (void)
{
   return 0L;
}
//----------------------------------------------//
void *dlsym (void *inHDll, const char *inSym)
{
   return GetProcAddress (inHDll, inSym);
}
//----------------------------------------------//

  
  Можно конечно и define-ами обойтись, но меня всётаки было бы инетерсно разобраться с этим вопросом именно с этой стороны. Может кто нибудь сталкивался с такой проблемой и сможет мне помочь?


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
MAKCim
Дата 12.5.2008, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



а где проблема?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
math64
Дата 12.5.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



используй cygwin - там эти функции есть
PM   Вверх
t_gran
Дата 13.5.2008, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



MAKCim,
Цитата

а где проблема?

Проблема, где найти оригинал? Ну или помочь c dllerror (Я пока поставил просто заглушку). Пробовал GetLastError (), но даже при положительном раскладе, она возвращает код ошибки, а не 0L.

math64, 
Цитата

используй cygwin - там эти функции есть

Надо глянуть smile

Это сообщение отредактировал(а) t_gran - 13.5.2008, 02:51


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Ken
Дата 13.5.2008, 05:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вы пытаетесь добиться кросплотформенности пытаясь реализовать часть POSIX API под win32. Только зачем? На самом деле вам нужны всего лишь: открыть библиотеку, закрыть и поиск символа. Советую думать только о задаче, т.е. завести свои функции, например: openLibrary (), closeLibrary () и findSymbol (). Кроме того зачем для вашей прикладной задачи столько деталей о флагах? В большинство случаев можно обойтись и без них. Вот и упростили задачу. Реализуйте эти функции под *nix используя libdl, под win32 LoadLibrary и т.д. Используйте только свою оболочку во всех программах. 

Совет: постарайтесь изолировать ваши программы от детали конкретной платформы или среды, тогда они будут проще и их легко можно переносить.

PM MAIL   Вверх
t_gran
Дата 13.5.2008, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Цитата

Кроме того зачем для вашей прикладной задачи столько деталей о флагах?

Это просто из оригинала заголовочника с *nix-ов. Как видно из кода, естественно они там не нужны по определению, но при портировании проекта могут быть проблемы из за того, что они не определены. smile

Цитата

Реализуйте эти функции под *nix используя libdl, под win32 LoadLibrary и т.д

Естественно. smile Я в начале так и писал, что проще define-ами обойтись. 



--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
just_geek
Дата 13.5.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

const char *dlerror (void)
{
    LPVOID lpMsgBuf;

    DWORD dw = GetLastError(); 

    FormatMessageA(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPSTR) &lpMsgBuf,
        0, NULL );
//printf("%s", (char*)lpMsgBuf);
    return (const char*)lpMsgBuf;
}


как то вот так вообщем то smile

Это сообщение отредактировал(а) just_geek - 13.5.2008, 15:42
PM MAIL   Вверх
t_gran
Дата 14.5.2008, 03:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



just_geek, спасибо, обязательно попробую. smile


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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