Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 |

 

  Вопрос: Инклуды в С++ Добавлено: 01.03.05 21:54  

Автор вопроса:  Neco | Web-сайт: neco.pisem.net | ICQ: 247906854 
Как мне объявить функцию MessageBeep (к примеру) в VC++ 6.0 без инклудов. Спрашиваю не потому что такой принципиальный и не хочу пользоваться инклудами, а потому что некоторые функции я в инклудах не могу найти (к примеру, OpenThread). И ещё потому, что хочется узнать как мне подключить к проекту библитеку без инклудов (к примеру, свою).
P.S. Динамически умею, но меня этот способ не прикалывает совсем.

Ответить

  Ответы Всего ответов: 35  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 01.03.05 23:34
Посмотри как в инклюдах они объявлены так же и объявляй...

Или получай указатель на функцию, и по прототипу ее вызывай... тоже вариант :)

Ответить

Номер ответа: 2
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #2
Добавлено: 02.03.05 00:11

Если нет инклудов, тогда грузи библиотеку и вызывай по stdcall соглашению. Вот, например, вызов Sleep из Kernel32.dll:

HINSTANCE hLib=LoadLibrary("kernel32.dll";);
if(!hLib)
return FALSE;

BOOL (WINAPI *InitShit)(DWORD wTime);
InitShit=(BOOL(WINAPI *)(DWORD wTime))GetProcAddress(hLib,"Sleep";);
InitShit(1000);

Ответить

Номер ответа: 3
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #3
Добавлено: 02.03.05 00:15
немного ошибся с возвращающим значением, там не BOOL должен быть, там VOID:

HINSTANCE hLib=LoadLibrary("kernel32.dll";);
if(!hLib)
return FALSE;

VOID (WINAPI *InitShit)(DWORD wTime);
InitShit=(VOID(WINAPI *)(DWORD wTime))GetProcAddress(hLib,"Sleep";);
InitShit(1000);

Ответить

Номер ответа: 4
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #4
Добавлено: 03.03.05 00:09
Странно, я думал, что эта вот мутатень и называется "динамическим подключением библиотеки". А когда в инклудах - "статическим".
Ну так это-то я умею - почти самое первое, что сделал на С++.

>Посмотри как в инклюдах они объявлены так же и объявляй...
Я уже заглядывал и ничего не понял - где имя библиотеки?
Как я уже говорил, в tlhelp32.h не было функции OpenThread и я решил засунуть туда её вручную (срисовать с какой-нибудь рабочей) и дык ни фига не вышло.

Делал так:
//-------------------------------------------------------
#ifndef _WINBASE_
#define _WINBASE_

#if !defined(_KERNEL32_)
#define WINBASEAPI DECLSPEC_IMPORT
#else
#define WINBASEAPI
#endif//

#ifdef __cplusplus
extern "C" {
#endif

WINBASEAPI
HANDLE
WINAPI
OpenThread(
    ;DWORD dwDesiredAccess,
    BOOL bInheritHandle,
    ;DWORD dwThreadId
    ;);

WINBASEAPI
VOID
WINAPI
Sleep(
    ;DWORD dwMilliseconds
    ;);

#ifdef __cplusplus
}
#endif

#endif // _WINBASE_
//-------------------------------------------------------

Ни хрена не понимаю чего что означает - просто скопировал.
Не работает.
Нашёл ссылку на Sleep в winbase.h, закомментировал там, а при команде FindDeclaration Sleep один фиг находится в winbase.h, хотя самодельный инклуд с вышеупомянутым кодом подключён и по идее должен работать.
Что делать? Как вы сами (я имею ввиду людей программирующих на С++) вызываете функции из своих библиотек? Неужели через LoadLibrary?
P.S. Как всегда в конце вопроса про С++ прошу:
Подкиньте кто-нить ссылку на сайт хелпа по С++, где говорят на Нормальном (а не заумном) русском языке, пожалуйста! Неужели всем сишникам уже столько лет, что они не могут нормальных хелпов писать? Типа таких, на которых я VB учился - в лёгкой непринуждённой форме (обходя места, которые ввиду своей заумности стоят на пути создания проги) объяняют как писать проги - не куски кодов, с которыми непонятно, что делать и которые куда ни суёшь нигде не компилируются, а ПРОГИ с подробным объяснением каждого действия.
Ну или станьте кто-нить моим учителем на время... 8(
Задолбался я уже не знать С++. Скока раз уже сажусь плотно за него - сдвиги есть, но единой картины не получается.

Ответить

Номер ответа: 5
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #5 Добавлено: 03.03.05 00:38
Чё, товарищ по несчастью? :)
Меня угораздило тоже закачать Visual C++ 2003 Toolkit. До этого смотрел за си-каракули со стороны и думал: "Какой же он мерзкий, этот Си!"
А теперь попробовал, и думаю: "Нет, это не мерзкий, это супербогомерзкий ублюдочный язык ц".
Всеми ругаемый Дельфи - да просто сказка, чудо, шедевр в сравнении с этим ц.

Neco, ты хоть какие ссылки на простейшие примеры знаешь? А то полдня сидел в Ослонете - ни одного(!) примера, который создаёт примитивное окошко не нашёл :( Исключительно консоли. Или в ц невозможно создавать окна, только консольные приложения?

Ответить

Номер ответа: 6
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #6 Добавлено: 03.03.05 07:51
Вот тут есть все инклюды, либы, хидеры, вся psdk. Правда веси 31 Мб (сетап онлайн):

http://www.microsoft.com/msdownload/platformsdk/sdkupdate/default.htm
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

Ответить

Номер ответа: 7
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #7
Добавлено: 03.03.05 08:19
Ни хрена не понимаю чего что означает - просто скопировал
Если просто скопипейстить декларацию из MSDN, не работает? А что выдает, мб, ты соответствующий .lib не подключил?
Как вы сами (я имею ввиду людей программирующих на С++) вызываете функции из своих библиотек?
Пока как-то получалось...
Неужели всем сишникам уже столько лет, что они не могут нормальных хелпов писать?
Сишники, как и линуксоиды, снобы, они не опустятся до того, чтобы писать "уроки для маленьких" :)
А теперь попробовал, и думаю: "Нет, это не мерзкий, это супербогомерзкий ублюдочный язык ц"
Гы, наверно, все, кто решают ботать Си проходят через это :)
А то полдня сидел в Ослонете - ни одного(!) примера, который создаёт примитивное окошко не нашёл :( Исключительно консоли. Или в ц невозможно создавать окна, только консольные приложения?
Получите, распишитесь:
#define APPNAME "Windows App"
#define APPTITLE "Windows Application"


#include <windows.h>


HWND hWnd;

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch(uMsg){
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND:
MessageBox(hWnd, "Hello, world!", APPNAME, MB_ICONASTERISK);
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

bool WindowInit(HINSTANCE hInst, int nCmdShow){
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(hInst, IDC_ICON);
wc.hIconSm = wc.hIcon;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.lpszMenuName = NULL;
wc.lpszClassName = APPNAME;
RegisterClassEx(&wc);
int t = GetLastError();
hWnd = CreateWindowEx(WS_EX_TOPMOST, APPNAME, APPTITLE, WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, NULL, NULL, hInst, NULL);
HWND Button1_hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "OK", WS_VISIBLE | WS_CHILD | WS_BORDER, 10, 10, 100, 30, hWnd, NULL, hInst, NULL);
t = GetLastError();
return (hWnd != 0);
}

bool AppInit(HINSTANCE hInst, int nCmdShow){
if(!WindowInit (hInst, nCmdShow)) return false;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return true;
}

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow){
MSG msg;
if(!AppInit(hInst, nCmdShow)) return false;
while(true){
if(PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)){
if(!GetMessage (&msg, NULL, 0, 0)) break;
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
return 0;
}

Ответить

Номер ответа: 8
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #8 Добавлено: 03.03.05 09:20
Ну вот, единственный, почти рабочий пример :)) Ура! Правда пришлось вставить
#pragma comment(lib, "user32.lib";)
#pragma comment(lib, "kernel32.lib";)
но это ерунда.
Я его теперь за шаблон буду использовать! И назову "Sharp.tpl"

Ответить

Номер ответа: 9
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #9
Добавлено: 03.03.05 19:59
И да пребудет с нами Сила! :)

Ответить

Номер ответа: 10
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #10
Добавлено: 03.03.05 23:07
>>Как вы сами (я имею ввиду людей программирующих на С++) вызываете функции из своих библиотек?
>Пока как-то получалось...
Ну и как?

>Сишники, как и линуксоиды, снобы, они не опустятся до того, чтобы писать "уроки для маленьких" :)
А сам как же? 8)

>А что выдает, мб, ты соответствующий .lib не подключил?
Выдаёт классическое - "функция не определена".
И кто такой "соответствующий .lib"?
Там что - для каждой функции ещё что-то подключать надо?

>А то полдня сидел в Ослонете - ни одного(!) примера, который создаёт примитивное окошко не нашёл
А я окошко сам наваял - долго е...ся, но наваял. Пока делал, кстати, пару открытий совершил, которые потом в своей vb'шной проге использовал.

>Вот тут есть все инклюды, либы, хидеры, вся psdk.
Кроме инклудов - всё непонятно. Что есть что - точнее на фига оно "есть".
Короче, объясни, если не трудно, что для чего и как используется.
Типа как "инклуд - код, который должен повторяться во всех стандартных прогах и следовательно его можно выделить в отдельный файл и не изменять. Надпись #include <файл> раноценна тому, что ты копируешь весь код <файла> на место этой строки." - это то, как я понимаю инклуды. А как ты понимаешь всё остальное (либы, хидеры, psdk)?

Ответить

Номер ответа: 11
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #11 Добавлено: 04.03.05 00:17
Окошко делать - не проблема, проблема - синтаксис, где какую корягу вставить типа фигурной скобки, точки с запятой и т.п. И больше всего добивают эти типы : HRESULT HWND HPEN и прочая гадость. По сути все - 4 байтные величины. Но если написано HDC, то HBRUSH в него не запихнешь даже бульдозером. И то и другое - 4 байта, dword.

PSDK - Platform SDK, пакет необходимого для разработки приложений (всякие тулзы и файлы, которые используют компилятор и линкер для работы)
Хидеры и инклюды - файлы, где описываются ф-ции их параметры

WINUSERAPI
BOOL
WINAPI
SetMenuItemInfoA(
    IN HMENU,
    IN UINT,
    IN BOOL,
    IN LPCMENUITEMINFOA
    ;);

либы - те же dll, но статические.

#include <файл> ничего никуда не копирует, просто указание для компилера, в каких файлах искать незнакомые имена ф-ций, структур и т.д.

#pragma comment(lib, "gdi32.lib";) - указание, где брать либу, чтобы прилинковать её. Причем если одна ф-ция используется из либы - вся либа целиком не будет цепляться к файлу. Только одна ф-ция. И ничего более. В отличие от dll, lib не нужно таскать с собой и ложить рядом с приложением. Необходимые куски кода из lib вделываются в твой ехе-шник. В отличие от dll, используя из которой всего одну ф-цию, потащишь за собой все.

На асме это примерно так, думаю си не отличается принципиально :) На сях только второй день, всего одно окно да пару dll сделал.

Ответить

Номер ответа: 12
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #12
Добавлено: 04.03.05 03:38
>>Как вы сами (я имею ввиду людей программирующих на С++) вызываете функции из своих библиотек?
>Пока как-то получалось...
Ну и как?

#include <smth.h>
#pragma comment (lib, "smth.lib";)

SmthFunc(SMTH_STUFF);

>Сишники, как и линуксоиды, снобы, они не опустятся до того, чтобы писать "уроки для маленьких" :)
А сам как же? 8)
А я исключение, мне просто лень :)
>А что выдает, мб, ты соответствующий .lib не подключил?
Выдаёт классическое - "функция не определена".
И кто такой "соответствующий .lib"?
Там что - для каждой функции ещё что-то подключать надо?
Если ты используешь какую-нибудь функцию из какой-нибудь DLL, у тебя есть 2 пути: 1) LoadLibrary-GetProcAddress; 2) Подключить хедер, соответствующий твой DLL и указать линкеру на lib-файл, соотвестствующий этой DLL. Lib-файл хранит "стуб" между твоей программой и DLL, нечто вроде того, что потом помещается в таблице импорта.
Инклюды и хедеры - это примерно одно и то же, но хедеры используются только для объявления функций, которые вызываются через либы, а в инклюдах часто идет полезный код.
проблема - синтаксис, где какую корягу вставить типа фигурной скобки, точки с запятой
Ну это, знаешь, базовый синтаксис, без его знания не стоит идти дальше.
И больше всего добивают эти типы : HRESULT HWND HPEN и прочая гадость. По сути все - 4 байтные величины. Но если написано HDC, то HBRUSH в него не запихнешь даже бульдозером. И то и другое - 4 байта, dword.
Меня тоже сначало бесило, после ассемблера-то :) А потом вдуплил. Если ты получаешь от CreateWindowEx HWND, а потом вдруг решишь на нем порисовать, как на HDC, компилятор тебе скажет - ты не прав, рисуют на HDC, а не на HWND, и ошибка будет тут же исправлена, а в случае ассемблера в более-менее большом исходнике, на отлов ошибки придется потратить порядочно времени. Тем более, что никакого бульдозера не надо, достаточно явного приведения типа, например HDC hDC = (HDC)hWnd;
#include <файл> ничего никуда не копирует, просто указание для компилера, в каких файлах искать незнакомые имена ф-ций, структур и т.д.
Нет, он как раз таки копирует, только делает это не компилятор, а препроцессор.
В отличие от dll, используя из которой всего одну ф-цию, потащишь за собой все.
Ну это из-за того, что собственно полезного кода в libах нету.

Ответить

Номер ответа: 13
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #13
Добавлено: 04.03.05 17:46
Не..ну что не говорите...C++ это оч. красивый язык!

Ответить

Номер ответа: 14
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #14 Добавлено: 04.03.05 19:28
Может, подсветка синтаксиса красивая :) ?
У меня в sourceinsight он весь такой разноцветный :)) Как цыганский платок :)

Ответить

Номер ответа: 15
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #15
Добавлено: 04.03.05 20:10
Может, подсветка синтаксиса красивая :) ?
Да он и сам ничего... От нечего делать написал на истории следующую программку:
#include <stdio.h>
void main(){
int res[1000], c=1, p=0;
res[0]=n;
do{
r=(n*m)%10;
res[c++]=r+p;
p=(n*m)/10;
}while(p||r!=n);
c--;
while(c--) printf("%d",res[c]);
}
Разве это не красота? Правда, я еще не проверял, скомпилируется ли это или нет :)
Или классический пример:
c=0;
++c+++=++c++;
Чему будет равно c?
Или совершенно потрясающий исходник, который я недавно заценял:
#define _ F-->00||F-OO--;
int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
           _-_-_-_
      _-_-_-_-_-_-_-_-_
   _-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_
   _-_-_-_-_-_-_-_-_-_-_-_
       _-_-_-_-_-_-_-_
           _-_-_-_
}

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам