C, C++, MFC, and Windows API FAQs |
When I started programming in C++ I ran into many common questions. So I made this page where others can see the questions and answers I have stumbled upon and put a lot of work into it. Hopefully you will be able to find an answer to a programming question you are trying to answer here. Note that most of these are not full tutorials, but rather quick answers.
I have found many of these answers on the Internet, changing some of them to make them a little shorter or easier. I think I gave credit to everyone I took work from, but if not, email me at mpiecyk@@@@gmail.com. Also, please email me if you find an error.
Credit is not required (unless I stated that someone else created the solution, then give credit to them).
This page contains FAQs about the "standard," portable functions of C and C++, and also contains answers that use the MFC (which comes with Visual Studio). Furthermore, many of the answers use the Windows API (which comes with Visual Studio, the Microsoft Platform SDK (which is free), and other places that I haven't tried out. You should be able to figure out if the solutions I provided are too advanced for you or not.
If a solution has red highlighting, it only works with Windows (and you probably have to include <windows.h> or use the MFC.) If a solution has blue highlighting, it should work with most operating systems.
The FAQs |
- Technical
- Execution
- Strings
- How do I convert an integer or short to a string?
- How do I convert a string to an integer?
- How do I write ANSI or Unicode to console?
- Does the length of strlen and wcslen include the terminating null character?
- What are the special chars that I can use in my strings?
- What happens if I do strcat("ASD",str1)?
- Memory
- How do I use malloc and free?
- How do I use calloc?
- What's the difference between malloc and new, free and delete?
- How do I use realloc to acquire even more memory?
- When I pass an array to a method, does the method alter the actual array or does it make a copy of the array?
- How do I remove, for instance, a password from the RAM while my program is running?
- How do I move memory to a different location while my program is running?
- How do I create a data segment where I can store public variables that can be accessed by any application?
- How can I make a region of data that can be accessed by other applications?
- Is my application data safe in the RAM?
- Explain the "virtual addresses" that are used by all of my programs.
- How many bytes is a pointer (in Windows XP)?
- How can I make a char array the exact size to hold two strings?
- File Operations
- How do I know if a file exists?
- How do I know if a file can be read?
- How can I get information about a file or directory?
- How do I delete a file that is not read-only?
- How do I change a file from read-only to writable?
- How do I extract a resource while my program is running?
- How do I write to a file using the Platform SDK?
- How do I read from a file using the Platform SDK?
- How do I get a file's size using the Platform SDK?
- How do I copy a file?
- Directory and Folder Operations
- Enabling Unicode
- Handles
- Registry
- Dialogs
- Input/Output
- Miscellaneous
- How do I let a program run in invisible mode where no windows or console boxes come up?
- How do the arguments of a console program work?
- How do I get the CWinApp that made my dialog while in the dialog class?
- How do I make a thread function?
- Why do many header files have "#ifdef __cplusplus" and "extern "C" { "?
- How do I link to a library without picking it as an option in Visual Studio?
- How do I log in with LogonUser?
- If I define a variable in one .cpp file, will the definition work for all of the files?
- Why put :: before function names?
- How do I define my application for Windows 2000 or Windows XP so I can include identifiers like MOUSEINPUT?
- How do I make a lot of radio buttons in different groups?
- If I define a variable inside of the stdafx.h file, will the definition work for all of the files?
- How do I determine the Operating System (OS)?
- Does "break" break out of every for and while loop?
- How does ^ work?
- What does =0 do?
- How do I use goto?
- What does inline do?
- How does typedef work?
- What does friend do?
- What does virtual do?
- What are templates?
- How do I write a switch statement?
- How do min and max work?
- What can I do to the DOS console to make it look fancier?
- Is "int a(5);" acceptable?
- How do I compile on Linux with g++?
- Visual Controls
- Networking
Probably the best way to execute a program (in Windows) is to use this code:
If you want to wait for the program to finish, add this above CloseHandle.
To start a program in a temporary DOS window:
system("start E://WINDOWS//system32//mspaint.exe");
ShellExecute(NULL, NULL, strFile, NULL, NULL, SW_SHOW);
ShellExecute(NULL, NULL, <fully_qualified_path_to_folder>, NULL, NULL, SW_SHOWNORMAL);
//is the app already running?
::CreateMutex( NULL, TRUE, TEXT("NAME-088FA2340-B10234-12343-B2346-0070967"));
if(GetLastError() == ERROR_ALREADY_EXISTS)
exit(0);
Using a character array
ASCII
itoa(integer,chararray,10);
//integer to string array, 10 = radix, returns the string array
TCHAR
_itot(integer,chararray,10);
Unicode
_itow(integer,chararray,10);
Using wsprintf
wsprintf(buff,"Value: %d", integer)
params are TCHAR *, so Unicode or ASCII may be used
returns "number of characters stored in the output buffer, not counting the terminating null character."
%f =float
%s=string
%c=char
%d=integer
Using the MFC CString:
CString MFCString;
MFCString.Format("Value: %d", integer);
%f =float
%s=string
%c=char
%d=integer
Using the Run-time Library
int _ttoi(TCHAR* str)
returns 0 when the input could not be deciphered
returns the int when the input was deciphered correctly
int puts( const char *string );
int _putws( const wchar_t *string );
puts also replaces the '/0' with a '/n' for a new line in the console.
No.
/n newline == endl
/r carriage return
/t tabulation
/v vertical tabulation
/b backspace
/f page feed
/a alert (beep)
/' single quotes (')
/" double quotes (")
/? question (?)
// inverted slash (/)
/0 null char means end of string
/ - Allows you to continue your string onto the next line. ex. "asdfg/
... hjkl" produces no compile errors.
The next time you use the string "ASD" it will be screwed up. Use this instead:
char str2[4] = "ASD";
strcat(str2,str1);
Example
char * string;
string = (char*)malloc( _MAX_PATH );
if( string == NULL )
printf( "Insufficient memory available/n" );
else
{
printf( "Memory space allocated for path name/n" );
free( string );
printf( "Memory freed/n" );
}
Faster example
void *array;
if ((array = malloc(length)) == NULL)
exit(1);
Function definition
void * calloc (size_t nelements, size_t size);
The two parameters are multiplied to obtain the total size of the memory block to be assigned.
Example
int * bobby;
bobby = (int *) calloc (5, sizeof(int));
if( bobby == NULL )
printf( "Insufficient memory available/n" );
else
{
printf( "Memory space allocated for path name/n" );
free( bobby );
printf( "Memory freed/n" );
}
new is a C++ operator which will allocate memory AND call the constructor of the class for which's object memory is being allocated.
Free is a C function which will free up the memory allocated. but delete is a C++ operator which will free up the allocated memory AND call the destructor of the object.
void *realloc( void *memblock, size_t size );
Returns NULL if there is not enough memory.
The method alters the array. No copy is made. Take a look at this example:
void method(char *buff2)
{
strcpy(buff2,"CHANGHED!!!");
}
int main(int argc, char* argv[])
{
char buff[512];
strcpy(buff,"Hello there!");
printf(buff);
method(buff);
printf(buff); //doesn't say "Hello there!" anymore! Says "CHANGHED!!!"
return 0;
}
SecureZeroMemory(szPassword, sizeof(szPassword));
memset( szPassword, '*', sizeof(szPassword) ); //will replace the password, starting at szPassword, with the '*' character, for a length szPassword
Copy Memory
Standard
void *memcpy( void *dest, const void *src, size_t count );
returns the value of dest
Windows API
CopyMemory
MoveMemory
#pragma data_seg(".SHARED")
char sharedvar[256] = {0}; // variables MUST be initialized,
#pragma data_seg()
#pragma comment(linker, "/section:.SHARED,RWS") //if you don't put this in the DLL, the data can't even be shared from function to function!
GlobalAlloc() (slower than heap) (the clipboard and DDE uses this)
heap functions
more...
Yes (mostly). All threads of a process can access its virtual address space. However, threads cannot access memory that belongs to another process, which protects a process from being corrupted by another process (unless the program crashes).
Memory management is no longer a problem because the system is free to manage memory by moving pages of physical memory without affecting the virtual addresses.
If the threads of a process attempt to use more physical memory than is currently available, the system pages some the memory contents to disk.
The total amount of virtual address space available to a process is limited by physical memory and the free space on disk available for the paging file.
Physical storage and the virtual address space of each process are organized into pages, units of memory, whose size depends on the host computer. For example, on x86 computers the host page size is 4 kilobytes.
When a page is moved in physical memory, the system updates the page maps of the affected processes.
When the system needs space in physical memory, it moves the least recently used pages of physical memory to the paging file.
On Windows XP (32-bit edition)
4 bytes
On Windows XP 64-bit edition
8 bytes
Therefore, the 4 byte pointer can point to anywhere in a total of 4 GB of memory
and the 8 byte pointer can point to 17,179,869,184 (17 trillion) GB of memory
char gray[] = "Gray";
char cat[] = "Cat";
char * graycat = malloc(strlen(gray) + strlen(cat) + 1);
strcpy(graycat, gray);
strcat(graycat, cat);
/**
* Returns true if the file or directory exists and false if neither exists.
*
* @param filepath file path, can be relative or absolute
* @return true if the file or directory exists
*/
bool FileExists(const TCHAR* filepath) {
struct _stat buf;
return _tstat(filepath, &buf)==0;
}
MFC
CFile f;
int success=f.Open(fileLocation,CFile::modeRead);
if(success)
{ ...
If you're not using the MFC, you can use this instead:
ASCII:
#include <stdio.h>
FILE *file;
file = fopen( fileLocation, "r" );
if( file == NULL )
break;
fclose(file);
(or _wfopen for wide characters)
Unicode:
#include <stdio.h>
FILE *file;
file = _wfopen( fileLocation, "r" );
if( file == NULL )
break;
fclose(file);
DWORD dwAttr = GetFileAttributes("C://Windows");
if(dwAttr == 0xffffffff)
{
DWORD dwError = GetLastError();
if(dwError == ERROR_FILE_NOT_FOUND)
{
// file not found
}
else if(dwError == ERROR_PATH_NOT_FOUND)
{
// path not found
}
else if(dwError == ERROR_ACCESS_DENIED)
{
// file or directory exists, but access is denied
}
else
{
// some other error has occured
}
}
else
{
if(dwAttr & FILE_ATTRIBUTE_DIRECTORY)
{
// this is a directory
if(dwAttr & FILE_ATTRIBUTE_ARCHIVE)
// Directory is archive file
if(dwAttr & FILE_ATTRIBUTE_COMPRESSED)
// Directory is compressed
if(dwAttr & FILE_ATTRIBUTE_ENCRYPTED)
// Directory is encrypted
if(dwAttr & FILE_ATTRIBUTE_HIDDEN)
// Directory is hidden
if(dwAttr & FILE_ATTRIBUTE_READONLY)
// Directory is read-only
if(dwAttr & FILE_ATTRIBUTE_REPARSE_POINT)
// Directory has an associated reparse point
if(dwAttr & FILE_ATTRIBUTE_SYSTEM)
// Directory is part or used exclusively by the operating system
}
else
{
// this is an ordinary file
if(dwAttr & FILE_ATTRIBUTE_ARCHIVE)
// File is archive file
if(dwAttr & FILE_ATTRIBUTE_COMPRESSED)
// File is compressed
if(dwAttr & FILE_ATTRIBUTE_ENCRYPTED)
// File is encrypted
if(dwAttr & FILE_ATTRIBUTE_HIDDEN)
// File is hidden
if(dwAttr & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)
// File will not be indexed
if(dwAttr & FILE_ATTRIBUTE_OFFLINE)
// Data of file is not immediately available
if(dwAttr & FILE_ATTRIBUTE_READONLY)
// File is read-only
if(dwAttr & FILE_ATTRIBUTE_REPARSE_POINT)
// File has an associated reparse point
if(dwAttr & FILE_ATTRIBUTE_SPARSE_FILE)
// File is a sparse file
if(dwAttr & FILE_ATTRIBUTE_SYSTEM)
// File is part or used exclusively by the operating system
if(dwAttr & FILE_ATTRIBUTE_TEMPORARY)
// File is being used for temporary storage
}
}
Windows API function
BOOL DeleteFile("myfile.txt")
Standard Library
#include <stdio.h>
if( remove( "myfile.txt" ) == -1 )
"Error deleting file"
else
"File successfully deleted"
#include <sys/stat.h>
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
_wchmod(FileName, _S_IWRITE); // change read-only file mode
_S_IWRITE = Writing permitted
_S_IREAD | _S_IWRITE = Reading and writing permitted
//by adrian cooper (and edited by me)
//e.g. ExtractBinResource(TEXT("BIN"), IDR_BIN1, TEXT("E://file.exe") );
void ExtractBinResource( LPCTSTR ResName, int nResourceId, LPCTSTR strOutputName )
{
HGLOBAL hResourceLoaded; // handle to loaded resource
HRSRC hRes; // handle/ptr. to res. info.
char *lpResLock; // pointer to resource data
DWORD dwSizeRes;
// find location of the resource and get handle to it
hRes = FindResource( NULL, MAKEINTRESOURCE(nResourceId), ResName);
// loads the specified resource into global memory.
hResourceLoaded = LoadResource( NULL, hRes );
// get a pointer to the loaded resource!
lpResLock = (char*)LockResource( hResourceLoaded );
// determine the size of the resource, so we know how much to write out to file!
dwSizeRes = SizeofResource( NULL, hRes );
/*
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode, 0 = do not allow other processes to read / write until we're finished
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
*/
HANDLE file = CreateFile(strOutputName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(file!=INVALID_HANDLE_VALUE)
{
printf("File opened.");
/*
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
*/
DWORD bytesWritten;
WriteFile(file,(LPCVOID)lpResLock,dwSizeRes,&bytesWritten,NULL);
CloseHandle(file);
}
}
HANDLE file = CreateFile(strOutputName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(file!=INVALID_HANDLE_VALUE)
{
printf("File opened.");
/*
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
*/
DWORD bytesWritten;
WriteFile(file,(LPCVOID)lpResLock,dwSizeRes,&bytesWritten,NULL);
CloseHandle(file);
}
HANDLE file = CreateFile(InfoClient,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(file!=INVALID_HANDLE_VALUE)
{
CloseHandle(file);
}
DWORD GetFileSize(
HANDLE hFile,
LPDWORD lpFileSizeHigh (this can equal NULL)
) != INVALID_FILE_SIZE
BOOL CopyFile(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
BOOL bFailIfExists
);
UINT GetWindowsDirectory(
LPTSTR lpBuffer,
UINT uSize
);
Make a string variable called AppDir
Get the User App Data Directory
#include <shlobj.h>
ITEMIDLIST* pidl;
HRESULT hRes = SHGetSpecialFolderLocation( NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE , &pidl );
if (hRes==NOERROR)
{
SHGetPathFromIDList( pidl, AppDir );
}
Get the Common App Data Directory
#include < shlobj.h>
ITEMIDLIST* pidl;
HRESULT hRes = SHGetSpecialFolderLocation( NULL, CSIDL_COMMON_APPDATA|CSIDL_FLAG_CREATE , & pidl );
if (hRes==NOERROR)
{
SHGetPathFromIDList( pidl, AppDir );
}
Use the constant MAX_PATH (which is 260 btw -- 257 for the letters and special characters like /, 2 for the C:, and 1 for the '/0')
//if the directory exists
DWORD dwAttr = GetFileAttributes(str);
if(dwAttr != 0xffffffff && (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
Windows API
CreateDirectory( "E://My Folder//ads//", NULL);
Windows 2000 and greater
#define _WIN32_WINNT 0x0500 //define windows version to "Windows 2000"
#define WINVER 0x0500 //define windows version to "Windows 2000"
#include <shlobj.h>
import shell32.lib
SHCreateDirectory(HWND hwnd, LPCWSTR pszPath )==ERROR_SUCCESS
//this version will create the directory and all of the sub-directories
Standard Library
#include < direct.h>
int mkdir(char *pathname);
0=success
-1=failure
Using the standard libraries
#include < direct.h>
_getcwd(buff,sizeof(buff));
Using the MFC
//sets the working directory, such as C:, E:/my folder, etc.
void SetWorkingDirectory()
{
TCHAR str[MAX_PATH];
GetModuleFileName(NULL, str, MAX_PATH);
CString strDir(str);
workingDir = strDir.Left(strDir.ReverseFind(_T('//')));
}
There is no Shell function that deletes a directory and all of its files, so we can use Feroz's function:
Uses the Windows API:
//By Feroz Zahid
BOOL DeleteDirectory(const TCHAR* sPath) {
HANDLE hFind; // file handle
WIN32_FIND_DATA FindFileData;
TCHAR DirPath[MAX_PATH];
TCHAR FileName[MAX_PATH];
_tcscpy(DirPath,sPath);
_tcscat(DirPath,"//*"); // searching all files
_tcscpy(FileName,sPath);
_tcscat(FileName,"//");
hFind = FindFirstFile(DirPath,&FindFileData); // find the first file
if(hFind == INVALID_HANDLE_VALUE) return FALSE;
_tcscpy(DirPath,FileName);
bool bSearch = true;
while(bSearch) { // until we finds an entry
if(FindNextFile(hFind,&FindFileData)) {
if(IsDots(FindFileData.cFileName)) continue;
_tcscat(FileName,FindFileData.cFileName);
if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
// we have found a directory, recurse
if(!DeleteDirectory(FileName)) {
FindClose(hFind);
return FALSE; // directory couldn't be deleted
}
RemoveDirectory(FileName); // remove the empty directory
_tcscpy(FileName,DirPath);
}
else {
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
_chmod(FileName, _S_IWRITE); // change read-only file mode
if(!DeleteFile(FileName)) { // delete the file
FindClose(hFind);
return FALSE;
}
_tcscpy(FileName,DirPath);
}
}
else {
if(GetLastError() == ERROR_NO_MORE_FILES) // no more files there
bSearch = false;
else {
// some error occured, close the handle and return FALSE
FindClose(hFind);
return FALSE;
}
}
}
FindClose(hFind); // closing file handle
return RemoveDirectory(sPath); // remove the empty directory
}
BOOL IsDots(const TCHAR* str) {
if(_tcscmp(str,".") && _tcscmp(str,"..")) return FALSE;
return TRUE;
}
MFC
If the symbol _UNICODE is defined for a build of your program, TCHAR is defined as type wchar_t, a 16-bit character encoding type; otherwise, it is defined as char, the normal 8-bit character encoding. Under Unicode, then, CStrings are composed of 16-bit characters. Without Unicode, they are composed of characters of type char.
Windows API
If the symbol UNICODE is defined before including < windows.h>, the windows functions will be set for Unicode. The standard libraries use TCHAR, so define both _UNICODE and UNICODE.
Placing L before a string converts it to Unicode, but this does not work correctly for Windows functions for some reason.
Use the _T( ) macro to acquire Unicode strings for a MFC application, and use the TEXT( ) macro to acquire Unicode strings for a Windows application.
Make these substitutions for char
TCHAR Where you would use char.
LPTSTR Where you would use char* or TCHAR*
LPCTSTR Where you would use const char*. CString provides the operator LPCTSTR to convert between CString and LPCTSTR, which is highly convenient.
In the Output category of the Link tab in the Project Settings dialog box, set the Entry Point Symbol to wWinMainCRTStartup.
Here's a function I wrote, but it can be improved if you don't like it:
//after calling this function make sure to free() the result when done
wchar_t* ASCIIToUnicode(const char *ascii, const int length )
{
//first it would be best to discover where the '/0' is located
int i;
for(i=0;i<length;++i)
{
if(ascii[i]=='/0')
break;
}
++i;
//now we can make the actual Unicode array
char *unicode = (char*)calloc(i,sizeof(wchar_t));
if(unicode==NULL)
exit(1);
for(int j=0;j<i;++j)
{
unicode[j*2]=ascii[j];
unicode[j*2+1]='/0';
}
return (wchar_t*)unicode;
}
Or try this function (I couldn't get it to work however)
mbstowcs( server, argv[1], MAXLEN ); (server = w_char with length MAXLEN, argv[1] = constant char)
ASCII
strcpy
strlen
strcat
strcmp
TCHAR ( #include <tchar.h> )
_tcscpy
_tcslen
_tcscat
_tcscmp
Using Windows LPTSTR
lstrcpy
lstrlen
lstrcat
lstrcmp
Unicode
wcscpy
wcslen
wcscat
wcscmp
Simply use the variable m_hWnd.
HWND GetConsoleWindow();
GetDesktopWindow();
HKEY hKey; //remember to call RegCloseKey when finished
DWORD exists; //will become either REG_CREATED_NEW_KEY or REG_OPENED_EXISTING_KEY
/*
HKEY hKey,
LPCTSTR lpSubKey,
DWORD Reserved,
LPTSTR lpClass,
DWORD dwOptions,
REGSAM samDesired, = needs to have KEY_QUERY_VALUE so we can query the value (KEY_ALL_ACCESS includes that)
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PHKEY phkResult,
LPDWORD lpdwDisposition
*/
if(::RegCreateKeyEx(HKEY_CURRENT_USER,TEXT("Software//My Folder//myvalues"),NULL,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&exists)==ERROR_SUCCESS)
{
//a new key was created
if(exists==REG_CREATED_NEW_KEY)
{
printf("New key/n");
//write a value to the registry
/*
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
const BYTE* lpData,
DWORD cbData
*/
DWORD type = REG_DWORD;
DWORD longValue = 40;
DWORD size = sizeof(DWORD);
if(::RegSetValueEx(hKey,TEXT("Version"),NULL,type,(BYTE*)(&longValue),size)==ERROR_SUCCESS)
{
printf("Wrote a value of 40 to the key./n");
}
else
{
printf("Failed to write a value of 40 to the key./n");
}
}
//the original key was opened
else
{
printf("Opened old key/n");
//get a value from the key
/*
HKEY hKey,
LPCTSTR lpValueName,
LPDWORD lpReserved,
LPDWORD lpType, = REG_BINARY (anything), REG_DWORD (long), REG_SZ (string)
LPBYTE lpData,
LPDWORD pcbData = First you input the size of the pvData buffer. After the function completes, it stores the amount of bytes that were copied to pvData (useful for strings), otherwise we get an error
*/
DWORD type = REG_DWORD;
DWORD longValue;
DWORD size = sizeof(DWORD);
if(::RegQueryValueEx(hKey,TEXT("Version"),NULL,&type,(LPBYTE)&longValue,&size)==ERROR_SUCCESS)
{
printf("Acquired the value.");
}
else
{
printf("Failed to acquire the value.");
}
}
RegCloseKey(hKey);
}
else
{
printf("Could not open key./n");
}
if(RegDeleteValue(hKey,TEXT("Version"))==ERROR_SUCCESS)
printf("Deleted the value.");
else
printf("Failed to delete the value.");
//import shlwapi.lib
#include < shlwapi.h>
if(SHDeleteKey(HKEY_CURRENT_USER,TEXT("Software//My Folder"))==ERROR_SUCCESS)
printf("Deleted the key.");
else
printf("Failed to delete the key.");
EndModalLoop(int nResult);
Place this function in the dialog's class and add it to the header as well.
// stops the default behavior of the Return and Escape keys
// http://www.codersource.net/
BOOL CCreateDirDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message==WM_KEYDOWN)
{
if(pMsg->wParam==VK_RETURN || pMsg->wParam==VK_ESCAPE)
pMsg->wParam=NULL ;
}
return CDialog::PreTranslateMessage(pMsg);
}
NewDialog *dlg;
dlg = new NewDialog;
dlg->Create(IDR_MYDIALOG);
dlg->ShowWindow(1);
ShowWindow(command);
command=SW_SHOW,SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE,SW_SHOWDEFAULT (Puts the window in the spot where it started up)
When the program starts...
if( RegisterHotKey(m_hWnd, 200, MOD_ALT | MOD_SHIFT | MOD_WIN, 'R')==FALSE ) //200 should be a unique id
AfxMessageBox("Failed to set the hotkey.");
To handle the hotkey in BEGIN_MESSAGE_MAP(CHotKeyTestDlg, CDialog)...
ON_MESSAGE(WM_HOTKEY,OnHotKey)
Subsequently you define the function...
LRESULT OnHotKey(WPARAM wParam, LPARAM lParam);
You need to check wParam in the function to see if it contains the id of your hotkey
if( wParam == 200)
When the window is closed ( OnStop() and OnDestroy() to be extra sure )...
UnregisterHotKey(m_hWnd,200);
GetAsyncKeyState();
BOOL SetCursorPos(x,y); //returns whether the operation was a success
Definition
BOOL GetCursorPos(LPPOINT lpPoint
);
MFC Example
POINT point;
GetCursorPos(&point);
AfxMessageBox(_itow(point.x,textArray,10));
//mouse input
INPUT input;
input.type=INPUT_MOUSE;
MOUSEINPUT mouseInput;
mouseInput.dx=0;
mouseInput.dy=0;
mouseInput.mouseData=NULL;
mouseInput.dwFlags=MOUSEEVENTF_LEFTDOWN;
mouseInput.time=0;
mouseInput.dwExtraInfo=0;
input.mi=mouseInput;
if(!::SendInput(1,&input,sizeof(INPUT)))
{
AfxMessageBox(_T("Error sending input."));
}
//(Unicode) keyboard input
INPUT inputKey;
inputKey.type=INPUT_KEYBOARD;
KEYBDINPUT keyInput;
keyInput.wVk=0;
keyInput.wScan=_T('a');
keyInput.dwFlags=KEYEVENTF_UNICODE;
keyInput.time=0;
keyInput.dwExtraInfo=0;
inputKey.ki=keyInput;
if(!::SendInput(1,&inputKey,sizeof(INPUT)))
{
AfxMessageBox(_T("Error sending input."));
}
#pragma comment(linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"")
You start off with:
int main( int argc, char *argv[] )
argv[0] should be the complete path of the executable
argc is the number of arguments provided (arguments with spaces in between), and should always be greater than one, since argv[0] is the path.
If you want to make a Windows console that features Unicode arguments, use:
void wmain( int argc, TCHAR *lpszArgv[ ])
or you could use yet another startup:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
CWinApp* AFXAPI AfxGetApp( );
//Thread
AfxBeginThread(ServerThread,this); //if you want the thread to have access to the current object then pass "this" into the thread's parameter
static UINT ServerThread(LPVOID pParam);
#ifdef __cplusplus
extern "C" {
#endif
//all of the code of a long header file goes here
#ifdef __cplusplus
}
#endif
if __cplusplus is defined, we are compiling C++ code
extern "C" makes the compiler simply compile C code
for example, if we used a namespace for the C code, the C code wouldn't get a namespace
since we told the compiler we only want fast C code.
#pragma comment (lib, "libname")
HANDLE hToken;
if(LogonUser(TEXT("User"),TEXT("."),TEXT("password"),LOGON32_LOGON_NETWORK,LOGON32_PROVIDER_DEFAULT,&hToken))
printf("Logged in");
else
printf("Login failed");
No, the definition will only work for the file you defined.
You may put :: before a C functions name, like the Windows Software Development Kit's function ::PostMessage(). The Windows SDK ::PostMessage has four paramters. On the other hand, the CWnd class has a PostMessage function too, but this one only has three parameters. If you are writing a CWnd class function in which you wish to call a function which happens to have the same name, you place :: before it.
#define _WIN32_WINNT 0x0501 //define windows version to "Windows XP"
#define WINVER 0x0501 //define windows version to "Windows XP"
#define _WIN32_WINNT 0x0500 //define windows version to "Windows 2000"
#define WINVER 0x0500 //define windows version to "Windows 2000"
#define _WIN32_WINDOWS 0x0410 //define windows version to "Windows 98"
#define WINVER 0x0410 //define windows version to "Windows 98"
Put some radio buttons in one group box, and the other radio buttons in another group box
Check "group" for the first radio button in each group box
Now you can select a bunch of different radio boxes at once as long as they're in a group box
Yes, even if you put the definition inside of the #if !defined(AFX_STDAFX_H__D...) condition (which makes sense since the variable AFX_STDAFX_H__D... will not be defined for every file and will need to be defined several times.)
Anyway the stdafx.h file should be included in every .cpp file so that is why it should work
//by Agus Kurniawan
// Expand the OS and NTVERSION environment variables.
OSVERSIONINFO osv;
osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if(GetVersionEx(&osv))
{
CString ServiceRelease = osv.szCSDVersion; //note: szCSDVersion = service pack release
switch(osv.dwPlatformId)
{
case VER_PLATFORM_WIN32s: //Win32s on Windows 3.1.
a_OS = "Microsoft ® Windows 3.1(TM)";
break;
case VER_PLATFORM_WIN32_WINDOWS: //WIN32 on 95 or 98
//determine if Win95 or Win98
if(osv.dwMinorVersion == 0)
{
a_OS = "Microsoft ® Windows 95(TM) " + ServiceRelease;
}
else if(osv.dwMinorVersion == 10) {
a_OS = "Microsoft ® Windows 98(TM) " + ServiceRelease;
}
if(osv.dwMinorVersion == 90)
{
a_OS = "Microsoft ® Windows Millenium(TM) " + ServiceRelease;
}
break;
case VER_PLATFORM_WIN32_NT: //Win32 on Windows NT.
if(osv.dwMajorVersion == 4)
{
a_OS = "Microsoft ® Windows NT(TM) " + ServiceRelease;
}
else if(osv.dwMajorVersion == 5)
{
a_OS = "Microsoft ® Windows 2000(TM)" + ServiceRelease;
}
break;
default:
a_OS = _T("");
}//end switch
}//end if
No, "break" only breaks out of one level of a for or while loop.
^ means "exclusive or."
If a==b==true, then a^b==false, otherwise this is the same as | (or).
In English, if both variable A and variable B are true, then TRUE ^ (or) TRUE is false.
virtual int area (void) =0;
It makes the class an abstract base, which means you can't instantiate the class.
loop:
i++;
goto loop;
inline int sum(int a, int b) {return a+b;} - replaces every call to this function with this code
This is faster, but takes up more space.
typedef can be used to make programs easily changeable and shorter.
Form
typedef existing_type new_type_name;
e.g. typedef char c;
friend allows a member to be accessed anywhere or allows a class to access anything in the current class being defined.
virtual means that a pointer should go to the more precisely defined function in a sub-class, if it exists.
You should use it if you know that you will have derived classes and you want those derived classes to have the most precise function.
template - template <class identifier> function_declaration; - Templates allow to create generic functions that admit any data type as parameters and return a value without having to overload the function with all the possible data types. Templates are not compiled until an instantiation of a whatever class is required
switch (x) {
case 1:
cout << "x == 1";
break;
case 2:
cout << "x == 2";
break;
default:
cout << "x can't be 1 or 2!";
}
The function definitions of min and max are simple:
min(a,b) and max(a,b)
They return which value is smaller or bigger.
Lots of things!
#include < conio.h>
textbackground(BLUE) sets the background color for text
clrscr() clears the entire screen with the background color
cprintf(string) prints from the cursor
textcolor(MAGENTA) changes the text color
gotoxy(x,y) goes to the position x,y (1,1)=up-left
getch() pauses
delline() deletes the current line and moves everything else above it where there's room
gettext(int left, int top, int right, int bottom, void *destin) copies whatever is on the screen into destin
puttext(int left, int top, int right, int bottom, void *source) puts the text in the rectangle on the screen
_setcursortype(int cur_t) _NOCURSOR, _NORMALCURSOR, _SOLIDCURSOR
textmode(C4350); sets the size and colors of the DOS window
Yes.
To compile:
g++ main.cpp -o main
To run:
./main
Using the MFC
if( AfxMessageBox(_T("Pick yes or no."), MB_YESNO|MB_ICONQUESTION|MB_TOPMOST ) == IDYES )
Using the Windows API
if( ::MessageBox(NULL, TEXT("Pick yes or no."), TEXT("Pick yes or no."), MB_YESNO|MB_ICONQUESTION|MB_TOPMOST ) == IDYES )
ASCII
MFC
char str[2];
str[0]=CHAR here;
str[1]='/0';
AfxMessageBox(str);
Windows API
char str[2];
str[0]=CHAR here;
str[1]='/0';
::MessageBox(NULL, str, "Character display", MB_OK|MB_TOPMOST);
Unicode
MFC
wchar_t str[2];
str[0]=WCHAR here;
str[1]='/0';
AfxMessageBox(str);
Windows API
wchar_t str[2];
str[0]=WCHAR here;
str[1]='/0';
::MessageBox(NULL, str, TEXT("Character display"), MB_OK|MB_TOPMOST);
::MessageBox(NULL, _itot(INTVALUE,strTemp,10), TEXT("Int value"), MB_OK|MB_TOPMOST);
CFileDialog f(TRUE);
f.m_ofn.lpstrTitle = _T("Choose a file to upload into the current directory...");
if(f.DoModal()==IDOK)
{
SetButtons(false);
f.GetPathName(); -> returns a CString of the full path of the file
}
Make an icon that has this ID in Visual Studio: 'IDR_MAINFRAME'.
by Alexander Simanov
Save this in the "res" folder:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="Microsoft.Windows.YourApplication"
type="win32"
/>
<description>YourApplication</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
Add two lines to the resource.h file
#define IDR_MANIFEST 1
#define RT_MANIFEST 24
Open up "res/???.rc2" and add
IDR_MANIFEST RT_MANIFEST MOVEABLE PURE
"res//ApplicationManifestXMLFile"
Modify the InitInstance method
InitCommonControls(); // initialize common control library
CWinApp::InitInstance(); // call parent class method
And you're done!
CEdit *ebptr = (CEdit *) GetDlgItem(IDC_EDIT1);
m_button.EnableWindow(); //enables
m_button.EnableWindow(FALSE); //disables
if(m_check.GetCheck() == BST_CHECKED)
#include <stdio.h>
#include <windows.h>
#include < winnetwk.h>
#pragma comment (lib, "mpr")
//by rxbagain
void EnumLocalNetwork(NETRESOURCE *lpnr)
{
HANDLE hEnum;
DWORD cEntries = -1, cbBuffer = 0x4000;
if (::WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, lpnr, &hEnum) == 0) {
if ((lpnr = (LPNETRESOURCE)::GlobalAlloc(GPTR, cbBuffer)) != NULL) {
while (::WNetEnumResource(hEnum, &cEntries, lpnr, &cbBuffer) == 0) {
for (int ctr = 0; ctr < (int)cEntries; ctr++) {
if (lpnr[ctr].dwDisplayType == RESOURCEDISPLAYTYPE_NETWORK ||
lpnr[ctr].dwDisplayType == RESOURCEDISPLAYTYPE_DOMAIN)
EnumLocalNetwork(&lpnr[ctr]);
else {
printf(lpnr[ctr].lpRemoteName);
printf("/n");
}
}
cEntries = -1;
cbBuffer = 0x4000;
}
::GlobalFree(lpnr);
}
::WNetCloseEnum(hEnum);
}
}
int main()
{
printf("Start/n");
EnumLocalNetwork(NULL);
printf("Finish/n");
return 0;
}
#include <stdio.h>
#include <windows.h>
#include < winnetwk.h>
#pragma comment (lib, "mpr")
//by rxbagain
void EnumLocalNetwork(NETRESOURCE *lpnr)
{
HANDLE hEnum;
DWORD cEntries = -1, cbBuffer = 0x4000;
if (::WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, lpnr, &hEnum) == 0) {
if ((lpnr = (LPNETRESOURCE)::GlobalAlloc(GPTR, cbBuffer)) != NULL) {
while (::WNetEnumResource(hEnum, &cEntries, lpnr, &cbBuffer) == 0) {
for (int ctr = 0; ctr < (int)cEntries; ctr++) {
if( RESOURCEUSAGE_CONTAINER == (lpnr[ctr].dwUsage & RESOURCEUSAGE_CONTAINER ) )
EnumLocalNetwork(&lpnr[ctr]);
else {
printf(lpnr[ctr].lpRemoteName);
printf("/n");
}
}
cEntries = -1;
cbBuffer = 0x4000;
}
::GlobalFree(lpnr);
}
::WNetCloseEnum(hEnum);
}
}
int main()
{
printf("Start/n");
EnumLocalNetwork(NULL);
printf("Finish/n");
return 0;
}
#include <winnetwk.h>
#pragma comment (lib, "mpr")
//by MSDN
BOOL WINAPI EnumerateFunc (LPNETRESOURCE lpnr)
{
HANDLE hEnum;
DWORD dwIndex,
dwResult,
dwBufferSize = 16384,
dwNumEntries = 0xFFFFFFFF; // Enumerate all possible entries.
LPNETRESOURCE lpnrLocal; // Pointer to enumerated structures.
dwResult = WNetOpenEnum (
RESOURCE_GLOBALNET, // All resources on the network
RESOURCETYPE_ANY, // All resources
0, // Enumerate all resources.
lpnr, // The container to enumerate
&hEnum); // Handle to resource
if (dwResult != ERROR_SUCCESS)
{
return FALSE;
}
// Allocate memory for NETRESOURCE structures.
if (!(lpnrLocal = (LPNETRESOURCE) LocalAlloc (LPTR, dwBufferSize)))
return FALSE;
do
{
dwResult = WNetEnumResource (
hEnum, // Resource handle
&dwNumEntries, // Number of entries
lpnrLocal, // LPNETRESOURCE
&dwBufferSize); // Buffer size
if (dwResult == ERROR_SUCCESS)
{
for (dwIndex = 0; dwIndex < dwNumEntries; dwIndex++)
{
// Insert code here to perform operations with lpnrLocal
// for example, to display contents of NETRESOURCE structures.
// ...
wprintf(lpnrLocal[dwIndex].lpRemoteName);
printf("/n");
// If this NETRESOURCE is a container, call the function
// recursively.
if (RESOURCEUSAGE_CONTAINER ==
(lpnrLocal[dwIndex].dwUsage & RESOURCEUSAGE_CONTAINER))
{
if(!EnumerateFunc (&lpnrLocal[dwIndex]))
return 0;
}
}
}
else if (dwResult != ERROR_NO_MORE_ITEMS)
{
return false;
break;
}
} while (dwResult != ERROR_NO_MORE_ITEMS);
LocalFree (lpnrLocal);
dwResult = WNetCloseEnum (hEnum);
if (dwResult != ERROR_SUCCESS)
{
return FALSE;
}
return TRUE;
}