Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Слушай, дружище, зачем так мучиться с этим языком С++, ты ведь не Билл Гейтс. Возьми тот же Python и программируй, он кроссплатформенный, под Windows тоже работает. Я сам давно заметил: то что на Си пишешь в страницу кода, на питоне решается в одну-две строки. При том, питон намного проще, я его сам недавно изучил по видеокурсу вот этому. Кстати, автор отлично там объясняет. Буквально день-два и уже будешь писать на нём, чего не скажешь про сложный С++.

Упростим загрузку DLL


Автор: Shoalin Panda

Описание

Обычно Dynamic Link Librarys загружают следующим способом: LoadLibrary, и GetProcAddress затем проверяют, чтобы адрес каждой функции не был NULL, приведение указателя функции и т.д. Всё это конечно утомительно, но, оказывается есть более простой способ совладать с DLL-ками.

 

//GetProcAddresses
 //Argument1: hLibrary - Обработчик загружаемой библиотеки
 //Argument2: lpszLibrary - Загружаемая библиотека
 //Argument3: nCount - Количество загружаемых функций
 //[Arguments Format]
 //Argument4: Function Address - Адрес функции
 //Argument5: Function Name -  Желаемое для нас имя функции
 //[Repeat Format]
 //
 //Returns: FALSE if failure
 //Returns: TRUE if successful
 BOOL GetProcAddresses(HINSTANCE *hLibrary,LPCSTR lpszLibrary,INT nCount,...)
 {
    va_list va;
    va_start( va, nCount );
 
    if ( ( *hLibrary = LoadLibrary( lpszLibrary ) ) != NULL )
    {
       FARPROC * lpfProcFunction = NULL;
       LPSTR lpszFuncName = NULL;
       INT nIdxCount = 0;
       while ( nIdxCount < nCount )
       {
          lpfProcFunction = va_arg( va, FARPROC* );
          lpszFuncName = va_arg( va, LPSTR );
          if ( ( *lpfProcFunction = GetProcAddress( *hLibrary,
                                              lpszFuncName ) ) == NULL )
          {
             lpfProcFunction = NULL;
             return FALSE;
          }
          nIdxCount++;
       }
    }
    else
    {
       va_end( va );
       return FALSE;
    }
    va_end( va );
    return TRUE;
 }
 

Итак, теперь можно в функции main посмотреть, как это работает ( компилировалось как консольное приложение )

#include 
 
 typedef int ( WINAPI *MESSAGEBOX ) ( HWND , LPCSTR, LPCSTR, DWORD );
 typedef int ( WINAPI *MESSAGEBOXEX ) (HWND , LPCSTR, LPCSTR, DWORD , WORD);
 
 void main(void)
 {
    MESSAGEBOX lpfMsgBox = NULL;
    MESSAGEBOXEX lpfMsgBoxEx = NULL;
    HINSTANCE hLib;
    if(GetProcAddresses( &hLib, "User32.dll", 2,
                         &lpfMsgBox, "MessageBoxA",
                         &lpfMsgBoxEx, "MessageBoxExA" ) )
    {
        lpfMsgBox( 0, "Test1", "Test1", MB_OK );
        lpfMsgBoxEx( 0, "Test2", "Test2", MB_OK, MAKELANGID( LANG_ENGLISH,
                                                      SUBLANG_ENGLISH_US ) );
    }
    if ( hLib != NULL )
       FreeLibrary( hLib );
 }
 

Вот собственно и всё.



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS