summaryrefslogtreecommitdiff
path: root/alf/alf.cpp
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2019-06-29 16:55:38 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2019-06-29 16:55:38 +0200
commitecfb4b72fec0c25ef416038ef22db5d34d687ee4 (patch)
tree119201f80df6c5bb6f40949a26d1015263cb4097 /alf/alf.cpp
parentae25d8012939de481633fa3572e7cd598d8a5a5f (diff)
get rid of last usages of InterlockedIncrement
doesn't work right on Win95/NT 3.51
Diffstat (limited to 'alf/alf.cpp')
-rw-r--r--alf/alf.cpp30
1 files changed, 17 insertions, 13 deletions
diff --git a/alf/alf.cpp b/alf/alf.cpp
index 06b0099..61ce4ee 100644
--- a/alf/alf.cpp
+++ b/alf/alf.cpp
@@ -419,16 +419,18 @@ ALF_Free(const void *p)
}
void
-ALF_BuildRandomClassName(const TCHAR* prefix, TCHAR* buf, DWORD cchBuf)
+ALF_BuildUniqueName(TCHAR *buf, const TCHAR *prefix, ULONG_PTR uniquifier)
{
- LONG_PTR c1, c2;
- ALF_UniqueCounterValue(&c1, &c2);
+ int prefixlen = lstrlen(prefix);
+ CopyMemory(buf, prefix, prefixlen * sizeof(*prefix));
- DWORD_PTR params[] = { (DWORD_PTR)prefix, (DWORD_PTR)c1, (DWORD_PTR)c2 };
-
- FormatMessage(FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_FROM_STRING,
- TEXT("%1.%2!d!.%3!d!"), 0, 0,
- buf, cchBuf, (va_list*)params);
+ int numlen = sizeof(LONG_PTR)*2;
+ int i = numlen - 1;
+ while (i >= 0) {
+ buf[prefixlen + i] = "0123456789ABCDEF"[uniquifier & 0xf];
+ uniquifier >>= 4;
+ i--;
+ }
}
LPTSTR
@@ -437,13 +439,16 @@ ALF_RegisterWindowClass(HINSTANCE hInstance, const ALFWindowClassParams *params)
WNDCLASS cls;
ZeroMemory(&cls, sizeof(cls));
+ ALFWindowVTable *pvtbl = ALF_New(ALFWindowVTable, 1);
+ *pvtbl = params->vtbl;
+
const TCHAR *classNamePtr = params->className;
TCHAR classNameBuf[256];
if (!classNamePtr) {
ZeroMemory(classNameBuf, sizeof(classNameBuf));
classNamePtr = classNameBuf;
- ALF_BuildRandomClassName(TEXT("ALFWindow"), classNameBuf, 256);
+ ALF_BuildUniqueName(classNameBuf, TEXT("ALFWindow."), (ULONG_PTR)pvtbl);
}
cls.style = params->classStyle;
@@ -461,11 +466,10 @@ ALF_RegisterWindowClass(HINSTANCE hInstance, const ALFWindowClassParams *params)
cls.lpfnWndProc = ALF_WindowProc;
ATOM classatom = RegisterClass(&cls);
- if (!classatom)
+ if (!classatom) {
+ ALF_Free(pvtbl);
return NULL;
-
- ALFWindowVTable *pvtbl = ALF_New(ALFWindowVTable, 1);
- *pvtbl = params->vtbl;
+ }
// XXX: This could have been a HWND_MESSAGE window, but Win95 doesn't support these
HWND tmp = CreateWindowEx(0, MAKEINTATOM(classatom), TEXT("dummy"), 0, 0, 0, 0, 0, NULL, 0, hInstance, 0);