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


Автор: Rrader 29.5.2008, 14:12
Здравствуйте. Вопрос очень простой smile 

Не могу разобраться с прямым импортом функций API без использования стандартных header'ов

Например, есть программа:

Код

#include <conio.h>
#include <windows.h>

void main()
{
    Sleep(1000);
    getch();
}

Как мне вручную объявить функцию Sleep, если убрать #include <windows.h> ?
Как я ни пробовал, одни ошибки...не могу понять...

Автор: Fazil6 29.5.2008, 14:18
Цитата(Rrader @  29.5.2008,  14:12 Найти цитируемый пост)
Как мне вручную объявить функцию Sleep, если убрать #include <windows.h> ?

в чем смысл?

Автор: Rrader 29.5.2008, 14:21
Нужно для одной версии компилятора, у которого нет многих библиотек API. Да и сам принцип хотелось бы узнать.

Или поставлю вопрос по-другому, как объявить ZwCreateFile (её нет в стандартных хедерах), скажем? Не через LoadLibrary, а напрямую...мне принцип нужно знать!

Автор: Lazin 29.5.2008, 14:40
Цитата(Rrader @  29.5.2008,  14:21 Найти цитируемый пост)
Нужно для одной версии компилятора, у которого нет многих библиотек API.

Это как?

Цитата(Rrader @  29.5.2008,  14:21 Найти цитируемый пост)
Или поставлю вопрос по-другому, как объявить ZwCreateFile (её нет в стандартных хедерах), скажем? Не через LoadLibrary, а напрямую...мне принцип нужно знать!

есть два способа:
1) обычный
  1. подключить заголовочный файл с функцией 
  2. подключить библиотеку импорта
2) напрямую (через одно место)
  1. загрузить DLL с помощью LoadLibrary
  2. получить указатель на нужную функцию из этой библиотеки

Цитата(Rrader @  29.5.2008,  14:21 Найти цитируемый пост)
ZwCreateFile 

что-бы использовать эту функцию нужно установить WDK

Автор: Rrader 29.5.2008, 14:56
Цитата(Lazin @  29.5.2008,  21:40 Найти цитируемый пост)
подключить заголовочный файл с функцией 

 smile  можно самый простенький, для функции Sleep? У меня не получается!

Автор: Lazin 29.5.2008, 15:09
Код

#include<windows.h>

 smile 

Автор: Fazil6 29.5.2008, 15:10
указать линкеру kernel32.lib
программа как-то так
Код

extern "C" void _stdcall Sleep(      unsigned long      );

int main()
{
    Sleep(1000);
    return 0;
} 

Автор: Lazin 29.5.2008, 15:10
ps
еще нужно подключить Kernel32.lib

Автор: Fazil6 29.5.2008, 15:13
вообще все что нужно - в таком случае указать линкеру lib и правильно написать объявление функции(тут могут быть варианты в зависимости от того какие соглашения у функций внутри либы. Хотя имея просмотрщик библиотек и анализируя декорированные имена эти соглашения можно вычислить).

Добавлено через 36 секунд
Цитата(Lazin @  29.5.2008,  15:10 Найти цитируемый пост)
еще нужно подключить Kernel32.lib 

а я что написал? smile 

Автор: Lazin 29.5.2008, 15:27
Цитата(Fazil6 @  29.5.2008,  15:13 Найти цитируемый пост)
а я что написал? smile  

на время сообщений посмотри smile 

зы 
если компилятор mingw, то libkernel32.a smile 
но там AFAIK достаточно указать компилятору kernel32, про расширение и lib он сам догадается

Автор: GolikovA 31.5.2008, 01:19
может гвоорим об этом

// A simple program that uses LoadLibrary and 
// GetProcAddress to access myPuts from Myputs.dll. 
 
#include <windows.h> 
#include <stdio.h> 
 
typedef int (__cdecl *MYPROC)(LPWSTR); 
 
VOID main(VOID) 
{ 
    HINSTANCE hinstLib; 
    MYPROC ProcAdd; 
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 
 
    // Get a handle to the DLL module.
 
    hinstLib = LoadLibrary(TEXT("myputs")); 
 
    // If the handle is valid, try to get the function address.
 
    if (hinstLib != NULL) 
    { 
        ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts"); 
 
        // If the function address is valid, call the function.
 
        if (NULL != ProcAdd) 
        {
            fRunTimeLinkSuccess = TRUE;
            (ProcAdd) (L"Message sent to the DLL function\n"); 
        }
 
        // Free the DLL module.
 
        fFreeResult = FreeLibrary(hinstLib); 
    } 
 
    // If unable to call the DLL function, use an alternative.
 
    if (! fRunTimeLinkSuccess) 
        printf("Message printed from executable\n"); 
}

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