Visual C++ FAQ

         

Чем отличается PID от hInstance?


PID - уникальный идентификатор объекта ядра - процесса

Inst - (упрощенно) указатель на область памяти, куда загружен экземпляр модуля (экзешника, dll-ки)



Как блокировать Alt+Tab во время выполнения программы?


CMainFrame::CMainFrame() { m_nHotKeyID = 100;

BOOL m_isKeyRegistered = RegisterHotKey(GetSafeHwnd(), m_nHotKeyID, MOD_ALT, VK_TAB);

ASSERT(m_isKeyRegistered != FALSE); }

//Убираем блокировку при выходе из приложения CMainFrame::~CMainFrame() { BOOL m_iskeyUnregistered = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID); ASSERT(m_isKeyUnregistered != FALSE); }



Как изменить разрешение экрана?


DEVMODE dm;

ZeroMemory(&dm,sizeof(DEVMODE)); dm.dmSize=sizeof(DEVMODE); dm.dmBitsPerPel=16; dm.dmPelsWidth=800; dm.dmPelsHeight=600; dm.dmDisplayFrequency=60; dm.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;

ChangeDisplaySettings(&dm,CDS_UPDATEREGISTRY);

[][]



Как я могy закpыть пpиложение, запyщенное по ShellExecute?




Как любое другое: получить HWND его окна; по этому HWND получить ID процесса и TerminateProcess() & WM_CLOSE для окна.



Как на VC5.0 создать окошко на full-screen?


BOOL CMyWnd::Create() { ... CRect rect(0, 0, GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)); strClass - заpегистpиpованный оконный класс. CreateEx(WS_EX_APPWINDOW, strClass, AfxGetAppName(), WS_SYSMENU | WS_POPUP | WS_VISIBLE, 0, 0, rect.right, rect.bottom, NULL, NULL, 0); ... }

или hwnd=CreateWindowEx(0, "Name", "Title", WS_POPUP|WS_SYSMENU, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), 0, 0, hInstance, 0);



Как, например, сетевую карту "отключить в данной конфигурации" через Win32 API?


Мой компьютеp->Свойства->Устpойства->NetCard->Отключено в данной конфигypации можно сделать программно:

Если в Win95 DiChangeState(lpdi, DICS_DISABLE, DICS_FLAG_CONFIGSPECIFIC); - только yчтите, что setupx.dll 16-битовая

Если в 98 или nt SetupDiChangeState



Как нарисовать рванное окно?


... WNDCLASS WndClass;

WndClass.lpszClassName =(LPSTR)"BalonHelp"; WndClass.hInstance =hInstance; WndClass.lpfnWndProc =BalonWndProc; WndClass.style =CS_SAVEBITS; // восстановление возлагаем на Win > WndClass.hbrBackground =GetStockBrush(NULL_BRUSH); WndClass.hCursor =LoadCursor(NULL,IDC_ARROW); WndClass.hIcon =NULL; WndClass.lpszMenuName =NULL; WndClass.cbClsExtra =0; WndClass.cbWndExtra =0;

RegisterClass(&WndClass); ... LRESULT CALLBACK BalonWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { case WM_PAINT: > // отpисовка всего окна ложится на твои плечи :-) ... case ... } return DefWindowProc(hWnd,msg,wParam,lParam); }



Как очистить экран в консоли Win32?


Можно использовать функцию ScrollConsoleScreenBuffer или следующий код:

COORD c; c.X = 0; c.Y = 0; CONSOLE_SCREEN_BUFFER_INFO bi; DWORD written; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), bi); FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ', bi.dwSize.X*bi.dwSize.Y, c, written); FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGRUND_BLUE /*цвет*/, bi.dwSize.X*bi.dwSize.Y, c,written);



Как определить, что запущен Screen Saver?


Если верить справочнику по Win32 API:

bool bIsSaverActive;

SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &bIsSaverActive, 0); if (bIsSaverActive) { ... }

или

BOOL IsSaverRunning() { BOOL isNT; OSVERSIONINFO ovi; ovi.dwOSVersionInfoSize=sizeof(ovi); GetVersionEx(&ovi); isNT=(ovi.dwPlatformId==VER_PLATFORM_WIN32_NT); if (!isNT) { UINT dummy, srunning=0; BOOL res=SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,&srunning,0); SystemParametersInfo(SPI_SCREENSAVERRUNNING,srunning,&dummy,0); if (srunning==0) return FALSE; else return TRUE; } // это прекрасно рабоатет под '95. Но НТ могут быть проблемы HWND hfw=GetForegroundWindow(); if (hfw==NULL) return TRUE; LONG wl=GetWindowLong(hfw,GWL_STYLE); if ((wl&0xF0000000)!=WS_POPUP|WS_VISIBLE) return FALSE; RECT rc; GetWindowRect(hfw,&rc); if (rc.right-rc.left!=GetSystemMetrics(SM_CXSCREEN) rc.bottom-rc.top!=GetSystemMetrics(SM_CYSCREEN)) return FALSE; return TRUE; }



Как определить позицию курсора в консоли Win32?


CONSOLE_SCREEN_BUFFER_INFO bi; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), bi); // bi.dwCursorPosition - кооpдинаты куpсоpа



Как отследить нажата ли в текущий момент кнопка мыши с помощью API?


Смотрите GetKeyState(int nVirtKeyCode).

Коды левой, правой и средней кнопок мыши соотверственно: VK_LBUTTON,VK_RBUTTON,VK_MBUTTON или

GetAsyncKeyState(VK_LBUTTON) (соответственно, VK_RBUTTON и VK_MBUTTON).



Как перехватывать ВСЕ исключения в процессе?


main() { try { ... } catch(...) { ^^^именно так и напиши! ... } }

Так как функция main() совсем не типична для Win32, предлагаю уделить внимание SetUnhandledExceptionFilter().



Как подгрузить Riched32.dll в InitInstance()?


BOOL CTestApp::InitInstance() { HMODULE hmod = LoadLibrary("Riched32.dll"); //Загружаем if(hmod == NULL){ AfxMessageBox("RichEdit пахать не будет"); return false; }

CTestDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); // в TestDlg нарисован RichEdit

FreeLibrary(hmod); //Выгружаем

return false; }



Как полностью перекрыть доступ к файлу во время работы с ним?


После создания с помощью следующего кода файл даже не читается:

CreateFile(f,GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);



Как получить список все запущенных процессов и потоков?


Для Windows 9x используйте CreateToolhelp32Snapsot/ Process32First(Process32Next)/ Thread32First(Thread32Next).

Для WinNT NTQuerySystemInformation. А можно так: получаете список окон в системе (каким угодно способом, если нужны только процессы - можно ограничиться top-level), далее - GetWindowTreadProcessID - получаете ID процесса (и нити). OpenProcess - дает handle процесса.



Как пользоваться элементом управления похожим на открытие файлов, только все это для каталогов?


Используем API( SHGetPathFromIDList ):

LPITEMIDLIS lpItemDList; char szWorkDir[MAX_LEN];

BROWSEINFO bi = {hWnd, NULL, m_szWorkDir, "Выберите каталог", BIF_DONTGOBELOWDOMAIN, NULL, NULL, 0 }; if(!(lpItemDList=SHBrowseForFolder(&bi))) return 0; SHGetPathFromIDList(lpItemDList, szWorkDir);

В szWorkDir получаешь выбранный каталог



Как поменять указатель мыши со стрелки на часики и обратно?


Используйте функции BeginWaitCursor() и EndWaitCursor(). Есть еще один (из многих) путь: void CTest::MyBiiiiigFunc() { CWaitCursor wait; for(int j=0; j

При создании объекта курсор заменяется на часики дефолтным конструктором. Деструктором - восстанавливается прежний.



Как принудительно завершить MS-DOS задачу, не дожидаясь ее нормального выхода?


DWORD ProcessID; //Здесь будет ProcessId, котоpый получили после CreateProcess HANDLE hProcess;

hProcess=OpenProcess(PROCESS_TERMINATE,0,ProcessID); if(hProcess!=NULL) { TerminateProcess(hProcess,0); CloseHandle(hProcess); }



Как программно определить тип файловой системы?


Используйте Win32 API - функцию GetVolumeInformation(...)



Как программно переключить раскладку клавиатуры?


Используйте функцию ActivateKeyboardLayout (...), которая позволяет установить язык для текущего потока.



Как программно сделать eject для CD-ROM'a, ZIP'a?


BOOL EjectDrive95(char *path) { HANDLE hDevice; DWORD dw; BOOL fResult; DIOC_REGISTERS reg;

hDevice = CreateFile("\\\\.\\vwin32", 0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL); if (hDevice == INVALID_HANDLE_VALUE) return FALSE; reg.reg_EAX = 0x440D; reg.reg_EBX = toupper(path[0]) - 'A' + 1; reg.reg_ECX = 0x0849; fResult = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_IOCTL,&reg, sizeof(reg), &reg, sizeof(reg), &dw, 0); CloseHandle(hDevice); return fResult; }

BOOL EjectDriveNT(char *path) { HANDLE hDisk; DWORD dwRc; TCHAR tsz[8]; SECURITY_ATTRIBUTES sa;

wsprintf(tsz, TEXT("\\\\.\\%c:"), TEXT('@') + toupper(path[0]) - 'A' + 1); sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; hDisk = CreateFile(tsz, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,&sa, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL); if (hDisk != INVALID_HANDLE_VALUE) { FlushFileBuffers(hDisk); return DeviceIoControl(hDisk, IOCTL_DISK_EJECT_MEDIA, NULL, 0, NULL, 0,&dwRc, NULL); } return FALSE; }



Как программно сжать/растянуть картинку?


Смотрите Win32 API-фукнции: StretchBlt, StretchDIBits и SetStretchBltMode.



Как с помощью API организовать запись с CD-ROM'а или микрофона?


Смотрите функции: waveInOpen waveInPrepareHeader waveInAddBuffer waveInStart.Только обязательно посмотрите примеры из MSDN.

[][][]



Как сделать, чтобы некотоpое пpиложение


/*apphider.cpp*/ /* Alexey Chubar & Paul Ishenin*/ #pragma hdrstop #include <condefs.h> #include <windows.h> #include <tlhelp32.h> #include <string.h> #include <stdlib.h> USELIB("KERNEL32.lib"); #pragma argsused extern "C" __stdcall DWORD RegisterServiceProcess(DWORD dwProcessID, DWORD dwType); char * ExtractFilePath(const char *Name) { int i = strlen(Name), l = strlen(Name); char *res="\0"; while ((i > 0)&&(Name[i] != '\\')) i--; if (i) { res = (char *)malloc(l - i); strcpy(res, Name + i + 1); res[l-i-1] = '\0'; } return res; } void HideApp(DWORD dwProcessID) { HWND MyHandle = GetTopWindow(0); DWORD WindowProcess; while (MyHandle != NULL) { if ((GetWindowThreadProcessId(MyHandle, &WindowProcess) != 0) && (WindowProcess == dwProcessID)) { ShowWindow(MyHandle, SW_HIDE); } MyHandle = GetNextWindow(MyHandle, GW_HWNDNEXT); } RegisterServiceProcess(dwProcessID, 1); } DWORD __fastcall FindID(const char *FName) { HANDLE h; PROCESSENTRY32 p; h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); p.dwSize=sizeof(p); if(!Process32First(h,&p)) return -1; if(strcmp(strlwr((char *)FName), strlwr(ExtractFilePath(p.szExeFile)))==0) { CloseHandle(h); return p.th32ProcessID; } while(Process32Next(h,&p)) if(strcmp(strlwr((char *)FName), strlwr(ExtractFilePath(p.szExeFile)))==0) { CloseHandle(h); return p.th32ProcessID; } CloseHandle(h); return -1; } int main(int argc, char* argv[]) { if (argc > 1) { DWORD ProgID=FindID(argv[1]); if(ProgID != (DWORD)-1) HideApp(ProgID); } return 0; }

или

_asm{ mov eax,1 push eax dec eax push eax call dword ptr[pRegisterServiceProcess] }

А теперь более подробно. Невидимость по Alt-Tab:

var WnHnd : Integer; WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE); WnHnd := WnHnd or WS_EX_TOOLWINDOW; {Типа Tools-окно} SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd);

Невидимость в Панели Задач:

ShowWindow[Async](Application.Handle,SW_HIDE)



Как сделать цикличным проигрывание MIDI-файла?


LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if(message==MM_MCINOTIFY) if(wParam!=MCI_NOTIFY_ABORTED) { if(m_bIsPlaing) { if(SetMidi()) PlayMidi(); } }

return CFrameWnd::WindowProc(message, wParam, lParam); }

BOOL CMainFrame::SetMidi() { StopMidi(); MCI_OPEN_PARMS OpenParm; OpenParm.dwCallback = (DWORD)GetSafeHwnd(); OpenParm.lpstrDeviceType = NULL; OpenParm.lpstrElementName = filename; DWORD flags=MCI_OPEN_ELEMENT; MCIERROR err; err=mciSendCommand(0, MCI_OPEN, flags,(DWORD)&OpenParm); if(!err){ m_nMidideviceID=OpenParm.wDeviceID; return TRUE; } else return FALSE; }

BOOL CMainFrame::PlayMidi(void) { MCI_PLAY_PARMS PlayParm; PlayParm.dwCallback =(DWORD)GetSafeHwnd(); PlayParm.dwFrom=0; MCIERROR err;

err=mciSendCommand(m_nMidideviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)&PlayParm); if(!err) { m_bIsPlaing=TRUE; return TRUE; } m_bIsPlaing=FALSE; return FALSE; }

BOOL CMainFrame::StopMidi(void) { m_bIsPlaing=FALSE; MCI_GENERIC_PARMS generic_params; generic_params.dwCallback=(DWORD)GetSafeHwnd(); mciSendCommand(m_nMidideviceID,MCI_CLOSE,MCI_WAIT,(DWORD)&generic_params); return TRUE; }



Как сделать какие-то действия дождавшись завершения процесса?


1. Открывать файл для записи.

2. Выяснить hWnd запушенной программы и использовать функцию IsWindow(Handle:hWnd), которая определяет, существует ли он.

3. Взять hProcess, возвращаемый CreateProcess, и возпользоваться функцией WaitForSingleObject с hProcess в качестве параметра.



Как сделать надпись перевернутую на 90 градусов?


Все как обычно, только в структуре LOGFONT установить (только TrueType шрифты):

lfOrientation = lfEscapement =900 - угол, в десятых долях град.

Кстати, Escapement приводит в повороту строки на 90 градусов, а Orientation - каждой буквы.

lfClipPrecision = CLIP_LH_ANGLES; - не забудьте установить этот флаг (под NT можно без него, а под 95/98 - никак)



Как сделать так, чтобы показывалось только имя приложения?


BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; cs.style &= ~(FWS_PREFIXTITLE|FWS_ADDTOTITLE); return TRUE; }



Как сделать так, чтобы при редактировании были видны комментарии для _своих_ методов или переменных?


1. Надо отметить, если не отмечено, все опции флажками в Tools/Options/Statement completion options;

2. Оставлять комментарии _перед_ объявлением, как например:

//Minimize to tray //Надо ли минимизировать в System Tray BOOL bTrayMin;



Как сделать так, чтобы _ресурсы_ dll были видны в пользующей его программе?


HGLOBAL LoadResource( HMODULE hModule, // хэндл модуля, откуда гpузишь pесуpс HRSRC hResInfo // идентификатоp pесуpса. );

То есть для того, чтобы загpузить pесуpсы из DLL, тебе надо загpузить DLL, а полученный хэндл использовать в LoadRecource



Как сделать так, чтобы во время выполнения длинного метода приложение реагировало на сообщения?


BOOL ProcessMessages() { MSG msgCur; if (!::GetMessage(&msgCur, NULL, NULL, NULL)) { return FALSE; }

// обрабатываем это сообщение

::TranslateMessage(&m_msgCur); ::DispatchMessage(&m_msgCur); return TRUE; }



Как сграбить экран?


1. Клавиша Alt+Print Screen (не забывайте, что эффект распространяется только на текущее окно)

2. С помощью MFC это делается командами GetDC(GetDesktopWindow), затем BitBlt куда надо. RTFM: BitBlt, CreateCompatibleDC, CreateCompatibleBitmap:

hDc = GetDC(hWndScr); hMemDc = CreateCompatibleDC(hDc); hBmpNew = CreateCompatibleBitmap(hDc, 500, 500); hBmpOld = SelectObject(hMemDc, hBmpNew); BitBlt(hMemDc, 0, 0, 500, 500, hDc, 0, 0, SRCCOPY);



Как средствами API реализовать в RichEdit разноцветный текст?


CHARFORMAT cf; cf.cbSize = sizeof(cf); cf.dwMask = CFM_COLOR; cf.crTextColor = ...; file://rgb SendMessage(hwndRtf,EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&cf);



Как убрать часы из SystemTray?


На время их можно убрать с помщью следующего кода:

hClockWnd=FindWindowEx(FindWindowEx(FindWindowEx(NULL,NULL,"Shell_TrayWnd",NULL), NULL,"TrayNotifyWnd",NULL),NULL,"TrayClockWClass",NULL); if(hClockWnd!=NULL) ShowWindow(hClockWnd,SW_HIDE);

[][][]



Как убрать кнопку с TaskBar'а?


С помощью Win32 API это можно сделать с помощью функции CreateWindowEx(), указав флаг WS_EX_TOOLWINDOW.



Как удалить .exe-файл из самого себя?


#include <windows.h> #include <stdio.h>

void DelSelf(void) { char modulename[MAX_PATH]; char batfile[MAX_PATH]; char batlines[MAX_PATH*4]; LPSTR tempdir; char Buf[MAX_PATH];

GetModuleFileName(NULL,modulename,MAX_PATH);

tempdir = ((GetEnvironmentVariable(TEXT("TEMP"), Buf, MAX_PATH) > 0) ? Buf : NULL);

strcpy(batfile,tempdir); strcat(batfile,"\\"); strcat(batfile,"delself.bat"); strcpy(batlines,"@echo off\n:try\ndel "); strcat(batlines,modulename); strcat(batlines,"\nif exist "); strcat(batlines,modulename); strcat(batlines," goto try\n"); strcat(batlines,"del "); strcat(batlines,batfile);

DWORD NOfBytes; HANDLE hbf= CreateFile(batfile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hbf,batlines,strlen(batlines),&NOfBytes, NULL); CloseHandle(hbf);

STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESHOWWINDOW;

CreateProcess( NULL, batfile, NULL, NULL, FALSE, IDLE_PRIORITY_CLASS|DETACHED_PROCESS, NULL, NULL, &si, &pi);

} void main() { DelSelf(); }



Как установить обои на Рабочий Стол?


SystemParametrsInfo(SPI_SETDESKWALLPAPER,0,'обои.bmp',SPIF_UPDATEINIFILE);

[][][]



Как узнать частоту обновления экрана перед началом переключения, чтобы потом ее восстановить?


Смотрите функцию GetDeviceCaps, с паpаметpом VREFRESH



Как узнать количество элементов и размер корзины? Как очистить корзину?


//Очищает корзину на указанном диске SHSTDAPI SHEmptyRecycleBin( HWND hwnd, LPCTSTR pszRootPath, DWORD dwFlags);

//Получает размер и количество элементов в корзине SHSTDAPI SHQueryRecycleBin( LPCTSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo);



Как узнать, кто в данный момент присоединен через Сеть к машине?


Это можно узнать по сессиям:

SESSION_INFO_2 *psi2; NET_API_STATUS Result; wchar_t wcServerName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD prefmaxlen = MAX_PREFERRED_LENGTH; DWORD entriesread; DWORD totalentries;

StringToWideChar( name, wcServerName, MAX_COMPUTERNAME_LENGTH );

Result = NetSessionEnum( (LPTSTR) wcServerName, NULL, NULL, 2, (unsigned char**) &psi2, prefmaxlen, &entriesread, &totalentries, NULL ); if( Result != NERR_Success ) throw Exception("Информация о сессиях не получена!");

[][][]



Как узнать наличие юзера сервере NT ?


NET_API_STATUS x=NetUserChangePassword(LPWSTR compname,LPWSTR username,

LPWSTR oldpassword,LPWSTR newpassword) - где newpassword=oldpassword.

По возвращаемому значению делаем свои выводы.Дешево и сердито.И страшных прав не надо как,например,на LogonUser().



Как узнать тип диска?


Для NT все пpосто - там надо вызвать QueryDosDevice, а остальное настолько очевидно, что описывать дольше чем самому посмотpеть ;-))

Для Win95 несколько сложнее. Я не буду выкусывать соответствующий кусок из функции опpеделения типа диска. Без контекста там не совсем понятно что к чему. Hадо только учесть, что эта функция 16-ти битная и ее надо вызывать чеpез Thunk-и. Конечно, часть того, что она делает можно сделать и в 32-х битном коде, но не все.

/************************************************************************\ * Module : DrvType.cpp * *-----------------------------------------------------------------------* * : : Original by Micro$oft corp. from MSDN * \************************************************************************/ /* How to Determine Drive Types in Windows

Article ID: Q105922

*/

#include <windows.h> #include <string.h> #include "..\SRC\IO_Const.h"

#pragma warning(disable:4704)

extern void FAR PASCAL DOS3Call(void);

// See the "MS-DOS Programmer's Reference" for further information // about this structure. typedef struct tagDEVICEPARAMS { BYTE bSpecFunc; // Special functions BYTE bDevType; // Device type WORD wDevAttr; // Device attributes WORD wCylinders; // Number of cylinders BYTE bMediaType; // Media type // Beginning of BIOS parameter block (BPB) WORD wBytesPerSec; // Bytes per sector BYTE bSecPerClust; // Sectors per cluster WORD wResSectors; // Number of reserved sectors BYTE bFATs; // Number of FATs WORD wRootDirEnts; // Number of root-directory entries WORD wSectors; // Total number of sectors BYTE bMedia; // Media descriptor WORD wFATsecs; // Number of sectors per FAT WORD wSecPerTrack; // Number of sectors per track WORD wHeads; // Number of heads DWORD dwHiddenSecs; // Number of hidden sectors DWORD dwHugeSectors; // Number of sectors if wSectors == 0 char Dummy[71]; // Fuck Microsoft and Microsoft's sample code!!! // ---------------------- // End of BIOS parameter block (BPB) } DEVICEPARAMS, FAR * LPDEVICEPARAMS;


// Function prototypes static BOOL GetDeviceParameters (int nDrive,LPDEVICEPARAMS dp) ; static BOOL IsCDRomDrive (int nDrive) ;

//----------------------------------------------------------------- // GetDeviceParameters() // // Fills a DEVICEPARAMS struct with info about the given drive. // Calls DOS IOCTL Get Device Parameters (440Dh, 60h) function. // // Parameters // nDrive Drive number 0 = A, 1 = B, 2 = C, and so on. // dp Pointer to a structure that will contain the drive's // parameters. // // Returns TRUE if it succeeded, FALSE if it failed. //----------------------------------------------------------------- static BOOL GetDeviceParameters (int nDrive, LPDEVICEPARAMS dp) { BOOL bResult = TRUE; // Assume success __asm { push ds mov bx, nDrive inc bx // Convert 0-based #'s to 1-based #s mov ch, 08h // Device category--must be 08h mov cl, 60h // MS-DOS IOCTL Get Device Parameters lds dx, dp mov ax, 440Dh int 21h jnc gdp_done // CF SET if error mov bResult, FALSE gdp_done: pop ds } return (bResult); } //----------------------------------------------------------------- // IsCDRomDrive() // // Determines if a drive is a CD-ROM. Calls MSCDEX and checks // that MSCDEX is loaded, and that MSCDEX reports the drive is a // CD-ROM. // // Parameters // nDrive Drive number 0 = A, 1 = B, 2 = C, and so forth. // // Returns TRUE if nDrive is a CD-ROM drive, FALSE if it isn't. //----------------------------------------------------------------- static BOOL IsCDRomDrive (int nDrive) { BOOL bResult = FALSE; // Assume not a CD-ROM drive __asm { mov ax, 150Bh // MSCDEX CD-ROM Drive Check xor bx, bx mov cx, nDrive int 2Fh cmp bx, 0ADADh // Check MSCDEX signature jne not_cd_drive or ax, ax // Check the drive type jz not_cd_drive // 0 (zero) means not CD-ROM mov bResult, TRUE not_cd_drive: } return (bResult); }

//----------------------------------------------------------------- UINT GetDriveTypeEx (int nDrive) { DEVICEPARAMS dp; UINT uType; UINT Drv4409Flag ; UINT fAddFlags = 0 ;

_fmemset (&dp, 0, sizeof(dp)); // Init device params struct uType = GetDriveType (nDrive);



switch (uType) { case DRIVE_REMOTE: // GetDriveType() reports CD- ROMs as Remote drives. Need -7395------------------------------------------------------------------------ // to see if the drive is a CD-ROM or a network drive. if (IsCDRomDrive (nDrive)) { return (EX_DRIVE_CDROM | EX_DRIVE_NOACCESS); } else { return (EX_DRIVE_REMOTE | EX_DRIVE_NOACCESS); } break;

case DRIVE_REMOVABLE: // Check for a floppy disk drive. If it isn't, then we // don't know what kind of removable media it is. // For example, could be a Bernoulli box or something new... if (GetDeviceParameters (nDrive, &dp)) switch (dp.bDevType) { // Floppy disk drive types case 0x0: case 0x1: // 5.25" floppy case 0x3: case 0x4: // 8" floppy return (EX_DRIVE_FLOPPY5); case 0x2: case 0x7: case 0x8: // 3.5" floppy return (EX_DRIVE_FLOPPY3); } return (EX_DRIVE_REMOVABLE); // Unknown removable media type break;

case DRIVE_FIXED: __asm { xor dx,dx mov bx,nDrive inc bl // 1-'A', 2-'B',... mov ax,0x4409 call far ptr DOS3Call mov Drv4409Flag,dx } if (Drv4409Flag & 0x0100) fAddFlags |= EX_DRIVE_NOACCESS ; // GetDeviceParameters returns a device type of 0x05 for // hard disks. Because hard disks and RAM disks are the two // types of fixed-media drives, we assume that any fixed- // media drive that isn't a hard disk is a RAM disk. if (GetDeviceParameters (nDrive, &dp) && dp.bDevType == 0x05) { if (Drv4409Flag & 0x8000) return (EX_DRIVE_SUBSTED | fAddFlags); else return (EX_DRIVE_FIXED | fAddFlags); } else { return (EX_DRIVE_RAMDISK | fAddFlags); } break; } return (EX_DRIVE_INVALID); // Drive is invalid if we get here. }




Как в консольной программе выводить цветные надписи и менять палитру?


=== Hачало CTEST.CPP === #include

void main() { HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); SMALL_RECT srct; CHAR_INFO chiBuffer[160]; COORD coord1, coord2; char ddd[666]; CharToOem("2:5095/38 - злобный ламеpюга", ddd); DWORD cWritten; coord1.Y = 0; coord1.X = 0; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); WriteConsoleOutputCharacter(hStdout, ddd, lstrlen(ddd), coord1, &cWritten); for (int i = 0; i < lstrlen(ddd); i++) { WORD wColors = 1 + i * 3; coord1.X = i; WriteConsoleOutputAttribute(hStdout, &wColors, 1, coord1, &cWritten); } srct.Top = 0; srct.Left = 0; srct.Bottom = 1; srct.Right = 79; coord1.Y = 0; coord1.X = 0; coord2.Y = 1; coord2.X = 80; ReadConsoleOutput(hStdout, chiBuffer, coord2, coord1, &srct); for (i = 0; i < 50; i++) { srct.Left = (SHORT)((double)(79 - lstrlen(ddd)) * rand() / RAND_MAX); srct.Top = (SHORT)((double)25 * rand() / RAND_MAX); srct.Bottom = srct.Top + 1; WriteConsoleOutput(hStdout, chiBuffer, coord2, coord1, &srct); } Sleep(10000); } === Конец CTEST.CPP ===



Как занести строку из CEdit'a в CListBox?


m_Edit.SetWindowText("aaa\r\nbbb\r\nccc"); // в Edit теперь три строки. Ловим первую char buffer[100]; // Выделяем буфер int count = m_Edit.GetLine(0, // индекс строки buffer, // указатель на буфер sizeof(buffer)); // размер буфера // Если OK, то возвращает кол-во скопированных символов buffer[count] = 0; // Скопированная строка не заканчивается \0 m_ListBox.AddString(buffer); // В данном случае "aaa"

или с помощью MFC: CTreeCtrl *list = (CTreeCtrl*)GetDlgItem(IDC_TREE); list->InsertItem( string, NULL, TVI_LAST );



Как запустить текущего e-mail клиента?


::ShellExecute(NULL,NULL,"mailto:any@mail.ru?subject=how",NULL,NULL,SW_SHOWNORMAL);



Как заставить CHttpFile принудительно передавать файлы в бинарном виде?


По умолчанию незвестным типам файлов MFC присваивает тип text/plain. Чтобы принудительно установить бинарный режим передачи, укажите тип как application/x-ofc.

[][]



Как завесить Windows?


1. Сделать файл system.ini больше, чем 64К. Вешается при загрузке.

2. Вызвать код:

cli

jmp $



Какие существуют функции для работы с COM-портом напрямую под Win9x?


Посмотрите функции:

BuildCommDCB BuildCommDCBAndTimeouts ClearCommBreak ClearCommError CommConfigDialog EscapeCommFunction GetCommConfig GetCommMask GetCommModemStatus GetCommProperties GetCommState GetCommTimeouts GetDefaultCommConfig PurgeComm SetCommBreak SetCommConfig SetCommMask SetCommState SetCommTimeouts SetDefaultCommConfig SetupComm TransmitCommChar WaitCommEvent



Почему функция CreateProcess не запускает *.lnk-файлы?


Потому что она создает процессы только для _запускаемых_ файлов. *.lnk-файлы не являются запускаемыми.Чтобы это сделать используйте ShellExecute.



С помощью каких механизмов две программы могут обмениваться данными?


1. OLE

2. Файлы проецируемые в память

3. Секции данных, pазделяемые несколькими пpоцессами

4. WM_COPYDATA

5. Именованные (и неименованные) каналы или pipes

6. Почтовые ячейки или mailslots

7. DDE(Dynamic data exchange).