Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прямой импорт из DLL 
V
    Опции темы
Rrader
  Дата 29.5.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


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

Репутация: 3
Всего: 191



Здравствуйте. Вопрос очень простой smile 

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

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

Код

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

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

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


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Fazil6
Дата 29.5.2008, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 60



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

в чем смысл?
PM MAIL   Вверх
Rrader
  Дата 29.5.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


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

Репутация: 3
Всего: 191



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

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


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Lazin
Дата 29.5.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(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

PM MAIL Skype GTalk   Вверх
Rrader
  Дата 29.5.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


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

Репутация: 3
Всего: 191



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

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


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Lazin
Дата 29.5.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Код

#include<windows.h>

 smile 
PM MAIL Skype GTalk   Вверх
Fazil6
Дата 29.5.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 60



указать линкеру kernel32.lib
программа как-то так
Код

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

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

PM MAIL   Вверх
Lazin
Дата 29.5.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



ps
еще нужно подключить Kernel32.lib
PM MAIL Skype GTalk   Вверх
Fazil6
Дата 29.5.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 60



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

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

а я что написал? smile 
PM MAIL   Вверх
Lazin
Дата 29.5.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



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

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

зы 
если компилятор mingw, то libkernel32.a smile 
но там AFAIK достаточно указать компилятору kernel32, про расширение и lib он сам догадается
PM MAIL Skype GTalk   Вверх
GolikovA
Дата 31.5.2008, 01:19 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



может гвоорим об этом

// 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"); 
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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