Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Загружаем dll-ку.


Автор: Antropoid 20.9.2006, 23:33
Хочу динамически подгрузить dll-ку и вызвать из нее функцию. В документации написано, что нужная мне функция содержится в netapi32.lib, я так понимаю, что она же содержится и в netapi32.dll? но,просмотрев содержимое этой dll-ки утилитой tdump.exe, - нужной мне функции там не оказалось...в каком месте я неправильно размышляю?

Автор: Fin 20.9.2006, 23:43
*.lib файлы это затычка для компилятора при статичной компоновке программы. Для динамического подключения ДЛЛ библиотек  эти файлы не нужны. Если нет нужной тебе функции в таблице экспорта, значит версия ДЛЛ библиотеки стара для мануала.

Автор: Antropoid 21.9.2006, 21:20
Брр...как это стара? В данном случае речь идет о netapi32.dll; у нее в секции exports нет ни 1-ой функции! В то же время netapi32.lib  имеет нужную мне NetWkstaGetInfo. Или я че то не то делаю?

Автор: Romikgy 21.9.2006, 21:27
Цитата(Antropoid @  21.9.2006,  20:20 Найти цитируемый пост)
В данном случае речь идет о netapi32.dll; у нее в секции exports нет ни 1-ой функции! 

А у меня целая пачка импортов

Автор: Antropoid 21.9.2006, 21:30
Так их че, тоже можно вызывать?

Автор: Romikgy 21.9.2006, 21:32
Цитата(Antropoid @  21.9.2006,  20:30 Найти цитируемый пост)
Так их че, тоже можно вызывать? 

А кто мешает?

Добавлено @ 21:33 
но только это от dll ки от ХР

Автор: Antropoid 22.9.2006, 17:50
Ну тогда скажи в чем моя ошибка

Код

        HMODULE hModule = LoadLibrary("Netapi32.dll");
        typedef int (*pNetWkstaGetInfo)(const LPWSTR, const DWORD,const LPBYTE*);  
             pNetWkstaGetInfo  NetWkstaGetInfo = (pNetWkstaGetInfo)GetProcAddress(hModule, "NetWkstaGetInfo");
        if(NetWkstaGetInfo != NULL)
            nStatus = NetWkstaGetInfo(pszServerName,dwLevel,(LPBYTE*)&pBuf);
        FreeLibrary(hModule);


такой код компилируется и линкуется, а вот при запуске пишет(если нажать "Отладка")
Unhendled exception at 0x00000008 in Inspection.exe: 0xC0000005:
Accedd violation reading location 0x00000008

Автор: Romikgy 22.9.2006, 22:17
Код

NET_API_STATUS NetWkstaGetInfo(

    LPTSTR servername,    
    DWORD level,    
    LPBYTE *bufptr    
   );    
 

зачем константы?

Автор: Damarus 22.9.2006, 22:42
Цитата(Antropoid @  22.9.2006,  18:50 Найти цитируемый пост)
Ну тогда скажи в чем моя ошибка

Код
typedef NET_API_STATUS (NET_API_FUNCTION *pNetWkstaGetInfo)(
    IN  LPWSTR   servername OPTIONAL,
    IN  DWORD   level,
    OUT LPBYTE  *bufptr
    );


Цитата(Romikgy @  22.9.2006,  23:17 Найти цитируемый пост)
LPTSTR servername,

Не LPTSTR, а LPWSTR.

Автор: Antropoid 22.9.2006, 23:10
Romikgy, cпасибо конечно, но константы были не причем.
Damarus, благодарю,- все получилось.

Автор: Romikgy 24.9.2006, 16:23
Цитата(Damarus @  22.9.2006,  21:42 Найти цитируемый пост)
Не LPTSTR, а LPWSTR.

Код

typedef TCHAR *LPTCH,*PTSTR,*LPTSTR,*LP,*PTCHAR;

А TCHAR уже сами делайте как должно оно работать 

PS и я привел прототип как он объявлен в мсдн

Автор: Damarus 25.9.2006, 07:39
Цитата(Romikgy @  24.9.2006,  17:23 Найти цитируемый пост)
А TCHAR уже сами делайте как должно оно работать

А при чём здесь TCHAR smile Функция NetWkstaGetInfo работает только с UNICODE (т.е. только с wchar_t). Она обьявлена в lmwksta.h так:
Код
NET_API_STATUS NET_API_FUNCTION
NetWkstaGetInfo (
    IN  LMSTR   servername OPTIONAL,
    IN  DWORD   level,
    OUT LPBYTE  *bufptr
    );


Добавлено @ 07:40 
Где LMSTR:
Код
//
// Only the UNICODE version of the LM APIs are available on NT.
// Non-UNICODE version on other platforms
//
#if defined( _WIN32_WINNT ) || defined( WINNT ) || defined( __midl ) \
    || defined( FORCE_UNICODE )
#define LMSTR   LPWSTR
#define LMCSTR  LPCWSTR
#else
#define LMSTR   LPSTR
#define LMCSTR  LPCSTR
#endif

Автор: Romikgy 25.9.2006, 08:49
скрин с msdn 
user posted image
еще вопросы есть ?

Автор: Damarus 25.9.2006, 08:58
Цитата(Romikgy @  25.9.2006,  09:49 Найти цитируемый пост)
еще вопросы есть ?

Есть smile Оригинальный MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netwkstagetinfo.asp

Автор: Romikgy 25.9.2006, 09:06
Damarus, даже если и так 
Код

NET_API_STATUS NetWkstaGetInfo(
  LPWSTR servername,
  DWORD level,
  LPBYTE* bufptr
);


никак не похоже на 
Цитата(Damarus @  25.9.2006,  06:39 Найти цитируемый пост)
NET_API_STATUS NET_API_FUNCTION
NetWkstaGetInfo (
    IN  LMSTR   servername OPTIONAL,
    IN  DWORD   level,
    OUT LPBYTE  *bufptr
    );

 smile 

PS ладно заканчиваем , вопрос решеный так что .....

Автор: Damarus 25.9.2006, 09:17
Цитата(Romikgy @  25.9.2006,  10:06 Найти цитируемый пост)
PS ладно заканчиваем , вопрос решеный так что .....

Да, и то верно, работает и пусть работает smile 

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