|
Bram van Kampen wrote: Any change in IDE experience constitutes a major re-training exercise for all users. Do the users interact with the actual OS? If so, switching to Linux might suffer from the same problem.
Sorry, I know this is not a very constructive comment, but it needs to be considered as well.
Soren Madsen
"When you don't know what you're doing it's best to do it quickly" - Jase #DuckDynasty
|
|
|
|
|
SoMad wrote: this is not a very constructive comment
Those are the best kind...
|
|
|
|
|
The POSReady version carries one distinction.
It is component-ized which means you can omit the parts of the OS that you don't use (like IIS or IE). If your system needs to be PCI compliant - omitting unused components means fewer security patches. If someone publishes a "0" day exploit to a subsystem you don't use - you don't have to scramble to patch all your systems.
From a UI perspective - it looks just like XP Professional.
Of course, 2019 isn't that far off. At some point you will have to move to a newer OS. This might give you an extra five years to make that decision.
|
|
|
|
|
Bram van Kampen wrote: for a cash register program.
Are you selling a POS or a program? If the latter then to increase your market you need to support both anyways. If the former then you roll out a new platform when you roll it out. Since they are still selling Windows 7 you don't need to move to Windows 8 until you want to.
Windows 7 extended support goes to 2020.
And of course Linux variants also do OS updates so you would still need to deal with those as well.
|
|
|
|
|
I am crazying with a problem with the following function:
CStringA EncryptDecryptString(CStringA szString, BOOL bEncrypt)
{
HCRYPTPROV hCryptProv = NULL;
LPCWSTR keyContainer = _T("MyKeyContainer");
if(CryptAcquireContext(&hCryptProv,keyContainer,NULL,PROV_RSA_FULL,0))
if (GetLastError() == NTE_BAD_KEYSET)
CryptAcquireContext(&hCryptProv,keyContainer,NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET);
HCRYPTHASH hHash = NULL;
TCHAR szPassword[11] = _T("Password");
if(CryptCreateHash(hCryptProv,CALG_MD5,0,0,&hHash))
{
if(!CryptHashData(hHash,(BYTE *)szPassword,wcslen(szPassword),0))
{
CryptDestroyHash(hHash);
hHash = NULL;
}
}
HCRYPTKEY hKey = NULL;
CryptDeriveKey(hCryptProv,CALG_RC4,hHash,0x00800000,&hKey);
DWORD length= szString.GetLength() + 1;
BYTE * cipherBlock= (BYTE *)malloc(length);
memset(cipherBlock, 0, length);
memcpy(cipherBlock, szString, length -1);
if (bEncrypt)
CryptEncrypt(hKey,0,TRUE,0,cipherBlock,&length,length);
else
CryptDecrypt(hKey,0,TRUE,0,cipherBlock,&length);
CStringA szOutString(cipherBlock);
if(cipherBlock)
free(cipherBlock);
if(hKey)
CryptDestroyKey(hKey);
if(hHash)
CryptDestroyHash(hHash);
if(hCryptProv)
CryptReleaseContext(hCryptProv,0);
return szOutString;
}
It's all ok with function, but sometimes when string is very very long during the Decryption i have only a part of string becouse the allocated memeory is not enought.
How can i alloc the correct amount of memory during the decryption phase?
|
|
|
|
|
|
Hi,
I show that some CMenu methods, need the ID of the menu that is already created inside the resource manager.
But, if the CMenu is created dynamically how do I assign a unique ID for that object ? If that is not possible, then how can I "translate" the menu handle to this unique resource ID so it would compatible with the Win32 API functions ?
Regards,
sdancer75
|
|
|
|
|
If it is a dynamically created menu then it cannot have a resource id, since there is no associated resource. It would probably help if you showed the piece of code that you are having a problem with.
|
|
|
|
|
You can definitely assign ID s to dynamically created menu items, see the CMenu::AppendMenu[^] method.
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
From MSDN
AppendMenu function
7 out of 10 rated this helpful - Rate this topic
Appends a new item to the end of the specified menu bar, drop-down menu, submenu, or shortcut menu. You can use this function to specify the content, appearance, and behavior of the menu item.
That's correct, but if the menu is a brand new dynamically created popupmenu and I dont want to append it to an existing menu, there is no point to use AppendMenu, right ?
sdancer75
|
|
|
|
|
Not right. When you dynamically create a menu, it has no items: you have to use the AppendMenu method to add, at least a menu item to it.
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
I suspect you are getting your terminology wrong, and as suggested please show the code that you are having problems with, and why you think it needs this id.
|
|
|
|
|
Richard MacCutchan wrote: I suspect you are getting your terminology wrong, and as suggested please show the code that you are having problems with, and why you think it needs this id.
Yes, there was a terminology wrong from my side..... The misunderstanding was done when I tried to initialize a CXTPBrowseButton from Codejock's framework and I needed a resource ID menu but I only create that menu dynamically.
The code example I tried to customize is :
m_edit1.Initialize(this, BES_XTP_POPUPMENU, IDR_POPUP);
and is declared like
virtual bool Initialize(CWnd* pParentWnd, DWORD dwBStyle, UINT nMenu = 0, int nSubMenuIndx = 0);
It seems that I dont have an option in this situation to pass an object handle !!!!
My worng thoughts was that I just needed an ID just to make an object unique for the internal use of the MFC framework but I didn't thought that it was merely a unique RESOURCE ID.
Thanks for clarifying this..... I just dazed and confused.
sdancer75
|
|
|
|
|
I have never come across Codejock so cannot offer any suggestions.
|
|
|
|
|
That's the id of the associated command, which is not the same as resource id. But maybe that is what the OP is really asking for.
|
|
|
|
|
You are right, of course (on both the points, I hope).
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
I am trying to pass a class I wrote to sprintf(). Not the class itself actually, but a pointer to a string the class holds.
With the VC++ CString class it works fine:
sprintf(t, "%s", cst);
But with my class, it either crashes the program or puts garbage into the t buffer:
sprintf(t, "%s", c);
Unless I use casting, and then it works ok:
sprintf(t, "%s", (char *)c);
What is my class missing? Some kind of an operator?
Here is my code:
class C1
{
public:
C1()
{
sprintf(m_Data,"C1 class");
}
operator char *() { return m_Data; }
private:
char m_Data[100];
};
int main(int argc, char* argv[])
{
char t[1000]="";
C1 c;
CString cst("Test c string");
sprintf(t, "%s", cst);
sprintf(t, "%s", c);
return 0;
}
|
|
|
|
|
Crazy Joe Devola wrote: What is my class missing? Some kind of an operator? You are missing nothing: Try the following statement:
char * p = c;
However the cast (either the one you used or the static_cast<char *>() ) is required in sprintf due to its signature (the type of its variadic arguments is established dynamically based on the fmt parameter) the char*() operator must be explicitely called.
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
Thank you.
Yes, char * works.
However, when i use the CString class as in my example, no casting or conversion is required at all. What does the CString class have that my C1 does not? (obviously a lot but specifically for what I am trying to do...)
|
|
|
|
|
You are right, of course. And that is, at the moment, a mystery to me too.
However, have a look at this MSDN page: CString::operator LPCTSTR[^].
That's make me guess in your actual code m_Data is not the unique (and not the first) data member.
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
I just tested OP's code (without the CString - no MFC or ATL) and it sends the actual C1 object as the last parameter, so the pointer will be rubbish. I also would like to know how CString manages to coerce the () operator without a cast.
|
|
|
|
|
It is not rubbish, in my test (VS2012 ). It is pointer to the C1 object, having the same address of its first data member (m_Data ) in this simple case, so everything goes right (of course if you insert, before m_Data , another member variable, for instance an int , the sprintf gets some garbage).
In the linked MSDN page they indded suggest to explicitely cast the CString object when used as sprintf parameter.
THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?!
-- C++ FQA Lite
|
|
|
|
|
Interesting. I used VS2010 Express, and copying OP's code, it copies the entire object onto the stack, thus the 'pointer' is garbage. When I use a cast it pushes the address of the object onto the stack and works as it should. More testing required ...
|
|
|
|
|
See my answer to OP below.
|
|
|
|
|
Well I have noticed,
VC 2012 has different parsing and scanning rules than earlier versions. The question is: Did the rules change in the standard, or was it incorrectly implemented by Microsoft.
Bram van Kampen
|
|
|
|
|