Вызов WinAPI из С-шного кода
От: Аноним  
Дата: 25.07.07 17:51
Оценка:
Как вызвать например ф-цию MessageBox() из С-шного кода?
Re: Вызов WinAPI из С-шного кода
От: Smooky Россия  
Дата: 25.07.07 19:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как вызвать например ф-цию MessageBox() из С-шного кода?


Берёшь и просто вызываешь:


int main(int argc, char* argv[])
{
  ::MessageBox(NULL, _T("This is my message box!"), _T("AHA!!!"), MB_OK);

  return EXIT_SUCCESS;
}


Вот прототипы (winuser.h):


WINUSERAPI
int
WINAPI
MessageBoxA(
    HWND hWnd ,
    LPCSTR lpText,
    LPCSTR lpCaption,
    UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
    HWND hWnd ,
    LPCWSTR lpText,
    LPCWSTR lpCaption,
    UINT uType);
#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE



Может я не понял вопроса!?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[2]: Вызов WinAPI из С-шного кода
От: dcb-BanDos Россия  
Дата: 26.07.07 05:41
Оценка:
Здравствуйте, Smooky, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>Как вызвать например ф-цию MessageBox() из С-шного кода?


S>Берёшь и просто вызываешь:


S>Может я не понял вопроса!?


Может имелось ввиду :

  #include <windows.h>


?!
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re: Вызов WinAPI из С-шного кода
От: F_1985 Украина  
Дата: 26.07.07 14:16
Оценка: +1 -2 :)))
Здравствуйте, Аноним, Вы писали:

А>Как вызвать например ф-цию MessageBox() из С-шного кода?


Вам нужно определить промежуточную функцию, напимер MyMessBox(); И в ней вызывать ту функцию которая Вам нужна.
При описании MyMessBox необходимо:

#ifdef __cplusplus
extern "C" { 
#endif
    int __stdcall MyMessBox( /*params */ );
#ifdef __cplusplus
}; //extern "C" {
#endif


Удачи!
Re[2]: Вызов WinAPI из С-шного кода
От: F_1985 Украина  
Дата: 26.07.07 16:05
Оценка:
Ув. Centaur если не согласны, то будь так добры, написать как правилно.

Спасибо.
Re[3]: Вызов WinAPI из С-шного кода
От: Пётр Седов Россия  
Дата: 26.07.07 20:04
Оценка:
Здравствуйте, F_1985, Вы писали:
F_>Ув. Centaur если не согласны, то будь так добры, написать как правилно.
Я тоже не согласен. Зачем делать какую-то промежуточную функцию? Можно вызвать WinAPI-шную функцию напрямую:
#include <windows.h>

int main() // или int __stdcall WinMain(HINSTANCE hExe, HINSTANCE hPrevExe, char pCommandLine[], int ShowType)
{
  MessageBox(NULL, "текст сообщения", "заголовок окна", MB_OK);
  return 0;
}
Пётр Седов (ушёл с RSDN)
Re[3]: Вызов WinAPI из С-шного кода
От: SWW Россия  
Дата: 27.07.07 06:33
Оценка:
Здравствуйте, F_1985, Вы писали:

F_>Ув. Centaur если не согласны, то будь так добры, написать как правилно.


А мне бы хотелось услышать объяснение Uzumaki Naruto (а можно и твое) — почему он считает такое извращение правильным и необходимым.
Re[4]: Вызов WinAPI из С-шного кода
От: F_1985 Украина  
Дата: 27.07.07 10:30
Оценка:
Здравствуйте, Пётр Седов!

Спасибо! Сегодня на свежую голову проверил, действительно работает без промежуточных ф-й.

Такие ф-и я использовал не для целей вызова API — функций. На это были другие потребности, но немного похожи. Вот так и ошибся.

P.S. Centaur извините.
Re[5]: Вызов WinAPI из С-шного кода
От: Пётр Седов Россия  
Дата: 27.07.07 11:52
Оценка:
Здравствуйте, F_1985, Вы писали:
F_>Спасибо! Сегодня на свежую голову проверил, действительно работает без промежуточных ф-й.
F_>Такие ф-и я использовал не для целей вызова API — функций. На это были другие потребности, но немного похожи. Вот так и ошибся.
Функции-обёртки разумно использовать для переносимости. Если по всему коду разбросаны вызовы WinAPI-шных функций, то тогда получается, что код гвоздями прибит к Windows (точнее, к WinAPI; можно реализовать WinAPI и в другой операционной системе). Вместо этого можно загнать WinAPI в функции-обёртки, например:
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
#include <windows.h>

void DPrint(const char pTemplate[], ...)
{
  char Buf[1024]; // кстати, буфер фиксированной длины - сомнительная идея :shuffle:
  va_list Items;
  va_start(Items, pTemplate);
  int Len = vsprintf(Buf, pTemplate, Items);
  assert(Len < 1024);
  va_end(Items);
  OutputDebugString(Buf); // WinAPI-шная функция
}

И использовать по всему коду уже свою функцию:
int main()
{
  int n = 3;
  DPrint("n = %i\n", n);
  const char* pName = "abc";
  DPrint("name = %s\n", pName);
  return 0;
}

Но это уже вопрос не технический (как вызвать WinAPI-шную функцию), а идеологический (изоляция вызовов WinAPI-шных функций), то есть совсем для другого форума – «Архитектура программного обеспечения».
Пётр Седов (ушёл с RSDN)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.