To convert wide strings to char or multi-byte without loss of information, the wide string must only contain characters from a specific known character set / code page.
When using the wcstombs() conversion function, you must first set the locale to those used by the input string and restore it after conversion (see setlocale()[^]). The default locale is 'C' which is not language specific (English).
If the code page of the input string is the same as for the current thread, you can use conversions provided by the CStringT class. This should do the job in most cases:
// Create a char/multi-byte string from wide string.// Pass LPCSTR to constructor, so use casting or GetString()!
// Convert it back to a wide string
Thanks for your reply. I am able to convert successfully using WideCharToMultiByte function. But I am facing the same problem when I use CStringA strA(str.GetStrng()) for conversion, even when I use SetLocale() function. Can you please help me out in this.
Sorry for my late answer. I overlooked your reply.
The CStringT class constructors and assignment operators accepting the LPCSTR and LPCWSTR types will convert the string if it does not match (when assigning LPCWSTR to a CStringA object it is converted to ANSI and when assigning LPCSTR to a CStringW object it is converted to Unicode). The conversion is internally performed using WideCharToMultiByte() and MultiByteToWideChar() with code page CP_THREAD_ACP (when using Visual Studio 2003 and later; with older versions or manually set preprocessor definition _CONVERSION_DONT_USE_THREAD_LOCALE, CP_ACP is used). See the ATL/MFC source files cstringt.h and atlconv.h if you are interested in how the conversions are performed.
If you are not calling SetThreadLocale() within your app, the thread will use the system locale.
If the results from using WideCharToMultiByte() and CStringT constructors are different, you have passed a code page number that differs from the default code page of the used locale.
So you may post your settings here or check it yourself:
The code page passed to WideCharToMultiByte()
The code page used by the CStringT class
To get the code page used by the CStringT class use this code snippet (assuming CP_THREAD_ACP is used):
// Default ANSI code pageint nCP = ::GetACP();
// Returns same as GetSystemDefaultLCID() when SetThreadLocale() has not been called.
LCID nLCID = ::GetThreadLocale();
if (::GetLocaleInfo(nLCID, LOCALE_IDEFAULTANSICODEPAGE, szACP, 7) != 0)
nCP = _tstoi(szACP);
Now compare nCP with the value passed to WideCharToMultiByte().
All these different locales and code pages may be confusing. So I will sum up the settings that may effect your conversions:
The system locale including its default ANSI code page
The user's locale including its default ANSI code page
The thread's locale including its default ANSI code page
The code page used by the CStringT class
The code page passed to conversion functions in your code
This program must accept as input from the user a value between 0 and 255 to be used as the
secret key, the name of the input file and the name of the output file. No line in the input file
should contain more than 4096 characters.
After the user would have provided their secret key, this program should read and perform an
XOR cipher on the contents of the input file and write the result to the output file.
If the input file has already been encrypted and the identical secret key that was used to
perform the initial encryption is provided, then the contents of the output file should be
deciphered into its original plain text.
can you please provide me with the algorithm on how to go about doing this work.
This is a fairly obvious homework question so you should at least make an effort to do the work yourself. If you do not understand how to apply XOR to a string of characters then you should read this page[^]. Similarly, reading and writing files is a basic part of the language that can be learned by reading these pages[^].
One of these days I'm going to think of a really clever signature.
You may use different methods to read Excel files. Which one to use depends on the version of the Excel files (XLS and/or XLSX) and if Excel is installed or not:
Using Excel Automation (COM / OLE Dispatch) with the Excel type library. This requires an installed Excel on the machine running your application (which defines what Excel file versions can be read) and the Excel type library on the development machine.
Using ODBC or ADO (OLE DB). These are database interfaces that handle sheets from Excel files like databases tables. Drivers for XLS files are present on all Windows systems. Drivers for XLSX files are installed by Office 2007 or with the 'Microsoft Access Database Engine 2010 Redistributable' package.
Once you have decided which method you want to use, search for samples here at CP and in the web using the above keywords. But be prepared that reading Excel files is not done with a few lines of codes.
I want to take backup of my server database into my local system.so i have used the following sql query
DECLARE @name VARCHAR(50) -- database name
DECLARE @path VARCHAR(256) -- path for backup files
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
-- specify database backup directory
SET @path = 'C:\Backup\'
-- specify filename format
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)
DECLARE db_cursor CURSOR FOR
WHERE name IN ('Sutra') -- exclude these databases
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
BACKUP DATABASE @name TO DISK = @fileName
FETCH NEXT FROM db_cursor INTO @name
i have created the Backup folder in C: drive.but it returns the following error
Msg 3201, Level 16, State 1, Line 28
Cannot open backup device 'C:\Backup\Sutra_20121116.BAK'. Operating system error 3(The system cannot find the path specified.).
Msg 3013, Level 16, State 1, Line 28
BACKUP DATABASE is terminating abnormally.
Here is my source code for locking my computer screen (Generally we do by pressing win+L)But Here in the below code what i am trying to do is , when user run the exe created by this application 1st the screen will be invisible (which is not happening in case of win+L) then next time when the user interact with the system it will show the user that the screen is locked .
int APIENTRY WinMain(HINSTANCE hInstance,
// Turn off monitor
Sleep(500); // Eliminate user's interaction for 500 ms
ret =SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 2);
@DavidCrow : You are genius man .. Thankxx a lot .. As you said its just because of my Graphics driver . Earlier my graphics driver was not compatible with the hardware .. Now i have installed the new driver .. and the issue is resolved.. Thankxx again ..
But I want to get the text when it's pasted.
I checked WM_PASTE but it is send to the control that has the focus not it's parent CWnd.
My dialog has some control of buttons, edit boxes, list control, ...
so it is posible that any of these controls has the focus (when something is paste)
I have created a COM dll . I'm calling another dll(C#.net dll\assembly)by adding refrence of this .net dll(from project properties) .And i able to access properly.
Now i want to make this .net dll usage should be independent of path. I mean -
I'll not add any reference or give path name in my COM dll Hence my COM dll don't know where this .net dll is located in the system. While COM Dll try to call this .net dll it'll search in whole system & load it.
Kindly please advice the C++ code for this
OR LoadLibrary() is only the method through that only we can load library dynamically(independent of path)
We don't want to give specific location of dependent Dll in COM code . Because this dependent DLL is not developed by us. This dll usually obtained after installation of a software.
we legally tied-off with this software company & code cann't be provided them(as usual company policy)
Hence if it is possible then we want to load dynamically.
I'm guessing if we do search the dependent dll in whole system while invoking ,there may be the performance issue may happen. But still the requirement is like this.
Hope you understood our requirement.
Hence if any best ways kindly please suggest.
Normal installations will create a registry entry which you can look for. You find the entry and grab the install directory. Then...
During your install.
1. Present a dialog to the user with the default product path (or the found one above.)
2. The user can modify the path.
3. When the user says ok you then verify that the correct dll is at the path specified.
4. If the dll (and correct version) is not found then put out an error message and go back to step 1.
Please use GetLogicalDriveStrings() or GetLogicalDrives().
GetDriveType() can be used to get details of the drive.
GetDiskFreeSpace() can be used to retreive information about the specified disk, including the amount of free space on the disk.
I have to use internet over GPRS modem in windows xp and windows 7, so i have created a dial-up connection using Rasdial API
But i get some problems.
that is, when i creat Ras entry by RasSetEntryProperties api, the entry come up with the default maximum speed of 115200 (but i must use other baud rate, for example, 7200000) .
I can edit this manually in the modem settings, but dose anyone know the API's i can use to set it in code?
I don't want to modify registry about modem.
I have looked through the MDSN, but RasSetEntryProperties function dosen't do it, and it says, lpbDeviceInfo param is unused in Windows XP.
Are there any other solutions except modify registry before making ras entry?
Here is some code from the draw function in my custom control. I am using a vector to contain data concerning portions of the control.
This code works. You will surely agree with me, though, that using the iterator 'x' to identify vector members in called functions is probably a tad on the clunky side. I have had a go at sending pointers to vector members. I gave up with this. I think this might not be the right way to go either. What it is the correct, elegant way to do this?
The 'x' becomes 'id' in the called function below which dereferences the vector member that is the same as the iterator in that first for loop block I posted. I know this is murky. That's why I want to make nicer.
void CScrollBarEx::DrawThumbSliderByID(CDC* inDC, CRect inDrawRect, short id)
// Override this to draw the thumb slider
COLORREF theThumbSliderColor = GetSysColor(COLOR_3DFACE);
COLORREF theThumbSliderTextColor = GetSysColor(COLOR_WINDOWTEXT);
ASSERT(inDC != NULL);
if (sliderVector[id].m_bThumbSliderDownFlag && sliderVector[m_currentSlider].m_bTrackThumbSliderFlag)
//theThumbSliderColor = sliderVector[m_currentSlider].m_ThumbSliderTrackColor;
theThumbSliderColor = sliderVector[id].m_ThumbSliderTrackColor;
theThumbSliderTextColor = m_ThumbSliderTextColor;
So you're accessing a vector with an index that comes from a variable of unknown type and origin. Not a lot of information to work with. Why do you think this is a problem? Is there a reason why you think x is not the appropriate index to use?
Until you explain what x is and where you got it from, it's hard for us to understand your problem - if there is one. Since the code works, the only suggestion I can make at this point is to rename x to something more ... self-explanatory, and add a few comments to explain what's going on (while you're still able to understand it). That may be helpful if you need to fix it in a year or two.
P.S.: There's one other suggestion I can think of: instead of passing x to those functions, pass a reference to the vector element. While technically that is the same as passing a vactor index, it removes the dependency between those functions and the entire vector.
Last Visit: 31-Dec-99 18:00 Last Update: 16-Aug-17 3:30