|
Hi,
1. I found the error. I am working with the CDC wrapper. Under certain circumstances the BkMode was not set. Even though it worked well in Win98 and XP, despite that the default BkMode is per definition OPAQUE.
The reason not to set the BkMode was, that BkColor will not be set either. Painting occurs in the OnCtlColor function, and in the mentioned case it returns a bit map brush to paint the background. I thought BkMode does not apply here - and XP and Win98 think the same way. However XP does not take an offence when using SetBkMode in this situation, so now it's working in all three systems
2. "Working component": I'm using CRichEditCtrl. It's functionality has been gradually increased since Win95. I took the corresponding components, for example riched20.dll from XP or from Win98SE and installed them in Win98 1sted and Win95; they work fine.
I was thinking of a way like this.
Do you know of a cross-reference between functions and components (DLLs)?
In Win95 the GetWindowPlacement function always returns a negative value in rect.right (rect.buttom is ok). In my system it is always (correct value - 5428), but I'm not sure if it is an universal number like the gravitational constant. I would like to try to replace the respective component of Windows.
Thanks anyway
|
|
|
|
|
Hi
I have a directory where i want to get a directory listing of all files.
How can i achieve this by using MFC classes?
Greetings
Jens
|
|
|
|
|
Try CFileFind .
Five birds are sitting on a fence.
Three of them decide to fly off.
How many are left?
|
|
|
|
|
I've found something that is quite unusual happening to my VC source files. Occasionally, when I compile, I get errors due to one character having been changed in one of my source files, or the src or include files in my Visual Studio directories. Usually the character is simply changed from lower to upper case, it seems at random.
For instance, today I had this change in my xlocale file, which prevented me compiling:
***** goodXLOCALE
static const mask * __cdecl classic_table() _THROW0()
***** badXLOCALE
static coNst mask * __cdecl classic_table() _THROW0()
***** Has anyone else ever seen this? Does anyone have any clue as to what it might be?
I look forward to hearing suggestions!
Puzzled Paul.
"The way of a fool seems right to him, but a wise man listens to advice" - Proverbs 12:15 (NIV)
|
|
|
|
|
I have never seen it but it almost sounds like a virus or something similar if it is randomly changing data on the hard drive.
|
|
|
|
|
Hi
How i can to create my ones callback function????
Thank.
|
|
|
|
|
Are you wanting to know how to create a callback funtion? If so, it depends on the context. Generally, however, you'll want to use the CALLBACK data type.
Five birds are sitting on a fence.
Three of them decide to fly off.
How many are left?
|
|
|
|
|
Another solution is __stdcall.
unsigned int __stdcall Function(datatype param);
Kuphryn
|
|
|
|
|
(sorry for the repost but this is really bugging me still):
The first time i call EncryptString (below) I pass "asdf" it encrypts to to be a length of 25 and encrypts it right. But when i try to encrypt a 2539 length string it returns a string of a length of 225 and only partically encrypted. Why is this happening and how do I fix it?
CString CEncyptionClass::EncryptString(CString m_strUnencryptedString)
{
//variables
//Date:11 22 03
CString m_strResultingText;
HCRYPTPROV hProv = NULL;
HCRYPTKEY hKey = NULL;
HCRYPTHASH hHash = NULL;
DWORD dwLength;
BYTE * pbBuffer;
LPTSTR m_tContents=ConvertCStringToChar(m_strUnencryptedString);
TCHAR szLocalPassword[] = _T("alongrandompassword");
//
// Get handle to user default provider.
if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))
{
// Create hash object.
if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
// Hash password string.
dwLength = _tcslen(szLocalPassword);
if (CryptHashData(hHash, (BYTE *)szLocalPassword, dwLength, 0))
{
// Create block cipher session key based on hash of the password.
if (CryptDeriveKey(hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE, &hKey))
{
dwLength= _tcslen(m_tContents);
pbBuffer=(BYTE*)malloc(dwLength);
if (pbBuffer != NULL)
{
memcpy(pbBuffer, m_tContents, dwLength);
if (CryptEncrypt(hKey, 0, true, 0, pbBuffer, &dwLength, dwLength))
{
m_strResultingText.Format("%s",pbBuffer);
CString strShow;
strShow.Format("After: %s \r\n(%s)\r\n %d %d", m_strResultingText,m_tContents,strlen((const char*) pbBuffer) ,dwLength);
MessageBox(strShow);
}
free(pbBuffer);
}
CryptDestroyKey(hKey); // Release provider handle.
}
}
CryptDestroyHash(hHash); // Destroy session key.
}
CryptReleaseContext(hProv, 0);
}
return m_strResultingText;
}
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
You sure it's not MessageBox not showing full string?... I assume you may get not printable characters after encoding.
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
The length of pbBuffer and m_strResultText is 225 .. the plain text string is 2539
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
That means according to your code:
LPTSTR m_tContents=ConvertCStringToChar(m_strUnencryptedString);
returns 225 length string...
Check ConvertCStringToChar function.
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
It's string is 2539 also, and its right.
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
Now I'm a little bit confused:
You are saying:
I pass "asdf" it encrypts to to be a length of 25 and encrypts it right.
But according to your code:
dwLength= _tcslen(m_tContents);<br />
pbBuffer=(BYTE*)malloc(dwLength);<br />
if (pbBuffer != NULL)<br />
{<br />
memcpy(pbBuffer, m_tContents, dwLength);<br />
<br />
if (CryptEncrypt(hKey, 0, true, 0, pbBuffer, &dwLength, dwLength))
You are only allocating 4 bytes in pbBuffer, as dwLength=4. Right?
How you get 25?
Maybe I missunderstanding...
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
The first time that m_Contents is "<password>asdf" it is encrypted to a 25 string (dwLength==25 for the orginal and after ) but then i pass a 2539 character long string to it and it encrypts only 255 (the dwLenght is also at 2539 when it goes to crypt encrypt
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
But according to your code with m_tContents="asdf":
dwLength= _tcslen(m_tContents); // <= will give you 4
pbBuffer=(BYTE*)malloc(dwLength); // <= pbBuffer should be allocated with 4 bytes
if (pbBuffer != NULL)
{
memcpy(pbBuffer, m_tContents, dwLength);
if (CryptEncrypt(hKey, 0, true, 0, pbBuffer, &dwLength, dwLength)) // <= should encrypt just 4 bytes
How you get 25, and if dwLength=25 after the call your pbBuffer is overrun!
However you passed dwLength = 4, your CryptEncrypt either should fail or your pbBuffer should be overrun
How are you getting 25?...
Could you be more specific?
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
noooo... m_tContents would equal "<password>asdf</password>" sorry about that .... ugh
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
If interested: Please provide ConvertCStringToChar() implementation....
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
LPTSTR CEncyptionClass::ConvertCStringToChar(CString string_to_be_converted)
{
LPTSTR return_value=new TCHAR[string_to_be_converted.GetLength()+1];
_tcscpy(return_value,string_to_be_converted);
return return_value;
}
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
I'm almost giving up. But check this:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/cryptencrypt.asppadding
A string, typically added when the last plaintext block is short. For example, if the block length is 64 bits and the last block contains only 40 bits, then 24 bits of padding must be added to the last block. The padding string may contain zeros, alternating zeros and ones, or some other pattern. Applications that use CryptoAPI need not add padding to their plaintext before it is encrypted, nor do they have to remove it after decrypting. This is all handled automatically
So, maybe you need to increase dwLength and make it even with 8 bytes length.
However, why CryptEncrypt is not failing then? Or maybe it does?
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
GetLastError doesn't return an error. The 2539 string is the only thing that messes up for some reason like i said it only encrypts 225 (thats whats returned from pbBuffer with dwLength set by strlen to 2539) and when passed through the decrypt function it returns the first 225 plaintext characters nothing after that
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
The length of pbBuffer and m_strResultText is 225 .. the plain text string is 2539, also it encrypts: "<password>something" fine but then when it gets called to encrypt the 2539 length string it messes up and encodes/returns only 225.
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
Hello guys,
I`m currently writing software for a Pocket PC. The problem with that is memory-leak detection is not so straight-forward as in Visual C++ 6.0 debugger.
Can anybody help me with a way how I can detect memory leaks and where they are located.
Not just memory leaks caused by new and delete( found a way for that allready here on Codeproject ), but also by GUI components. (CreateObjectIndirect vs DeleteObject etc...).
Is there a way to see if maybe memory is leaked in third party libraries or dll`s ?
I mean, I looked my code from front to back, left to right, back to front, right to left and it looks all good to me, but still it looks like I leak memory and I don^t have a clue where that could be happening..
If anybode can provide any help, please do. Or if you know any links where a solution might be found, please let me know.
Greetz,
Davy
|
|
|
|
|
The most best way to check for memory leaks is the most apparent as well: in your dev. environment, start some type of memory monitor, like the Task Manager in Windows. Then just run & stop your test application for 10-15 times in a row. If you see a radical memory increase, then you have a leak.
Small memory leaks (under 10 kb) are usually not even detectable, and in most cases, harmless. Of course, if you don't boot the Pocket PC at all, then they may cause an issue in a long run.
In the end, if you don't have access to MSVC++'s debugger, you should invest on some Memory Validator programs available commercially. They are _made_ for detecting memory/handle/GUI leaks, and are very efficient at it.
I'm not sure what you use to create the GUI. But C/C++ does not care. Everything always comes down to using new/delete pair. The MFC framework does it, deep down under. You just can't see it. Even the RUNTIME_CLASS macro's and the related functions use new/delete, or the C-version, malloc.
For the Windows GUI and MFC, the rule of thumb for resource leaks is that if you load a resource from a disk file and don't unload it, then you leak memory. If you load the resource from your application instance (it is saved in the resource script), then you don't need to release it, as it is released automatically when the instance exits.
All in all, get a memory validation software. It'll help you a long way without headaches.
-Antti Keskinen
----------------------------------------------
The definition of impossible is strictly dependant
on what we think is possible.
|
|
|
|
|
Hi!
Need some help with converting integer to char. Because it can't find this function. Is there only atoi that is build in the library? And if so, do I have to make my own itoa?
Do someone know?
|
|
|
|
|