|
While it is true that XP has gone away, the componentized point of sale version of Windows XP - called "POSReady" will continue to be supported for some time.
http://support.microsoft.com/lifecycle/search/default.aspx?sort=PN&alpha=POS&Filter=FilterNO
You're good until 2019.
modified 17-Sep-14 15:07pm.
|
|
|
|
|
Never heard of PoSReady... it's probably just a pre-built version of XP Embedded or one of their other embedded variants.
|
|
|
|
|
Hi
Thanks for the Reply.
bling wrote: While it is true that XP has gone away, the componentized point of sale version of Windows XP - called "POSReady" will continue to be supported for some time.
We Don't use that version.
Laundrette and Drycleaning POS systems are far more complicated than say your average Corner shop POS. The latter deals in
Commodities. (A Packet of Branded butter is the same as the Next one. We don't care which particular package leaves the
shop, or, who walks out with it, as long as we get the money, and update the stock.) In a laundrette, every customer wants
their own shirt back, and, we need to know who did what in case of complaint. So a laundrette POS System comprises indeed
of the functions of a traditional POS system, such as keeping track of cash and cash drawer contents. In addition to this,
the POS System needs means to identify customers, and to book in customer orders, and prioritize these. The staff doing
the actual work need a way to find out which orders are at hand, and a way to mark these orders as 'Completed' Management
needs statistics. Personell needs records of Production in order to calculate Staff production bonuses, etc, etc. We are
talking 'Database Management'
Our system consists of a suite of a bakers dozen interlocking applications. The lot works well in Windows XP. In fact,
there is nothing that either Vista, Win7 or Win8 has to offer that would be of any benefit.
The Software is written to be used by staff which are employed because of their Laundry skills, not their computer skills.
Any change in IDE experience constitutes a major re-training exercise for all users.
Bram van Kampen
|
|
|
|
|
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
|
|
|
|
|