HANDLE _CreateActCtxFromFile(LPCWSTR FileName, int line)
{
- ACTCTXW ActCtx = {sizeof(ACTCTX), 0, FileName};
+ ACTCTXW ActCtx = {sizeof(ACTCTX)};
HANDLE h;
+ WCHAR buffer[MAX_PATH] , *separator;
+
+ ok (GetModuleFileNameW(NULL, buffer, MAX_PATH), "GetModuleFileName failed\n");
+ separator = wcsrchr(buffer, L'\\');
+ if (separator)
+ wcscpy(separator + 1, FileName);
+
+ ActCtx.lpSource = buffer;
SetLastError(0xdeaddead);
h = CreateActCtxW(&ActCtx);
- ok_(__FILE__, line)(h != INVALID_HANDLE_VALUE, "CreateActCtx failed\n");
+ ok_(__FILE__, line)(h != INVALID_HANDLE_VALUE, "CreateActCtx failed for %S\n", FileName);
// In win10 last error is unchanged and in win2k3 it is ERROR_BAD_EXE_FORMAT
- ok_(__FILE__, line)(GetLastError() == ERROR_BAD_EXE_FORMAT, "Wrong last error. Expected %d, got %lu\n", ERROR_BAD_EXE_FORMAT, GetLastError());
+ ok_(__FILE__, line)(GetLastError() == ERROR_BAD_EXE_FORMAT || GetLastError() == 0xdeaddead, "Wrong last error %lu\n", GetLastError());
return h;
}
ok_(__FILE__, line)(GetLastError() == 0xdeaddead, "Wrong last error. Expected %lu, got %lu\n", (DWORD)(0xdeaddead), GetLastError());
}
-void TestClassRedirection(HANDLE h, LPCWSTR ClassToTest, LPCWSTR ExpectedClassName, LPCWSTR ExpectedModule, ULONG ExpectedClassCount)
+void TestClassRedirection(HANDLE h, LPCWSTR ClassToTest, LPCWSTR ExpectedClassPart, LPCWSTR ExpectedModule, ULONG ExpectedClassCount)
{
ACTCTX_SECTION_KEYED_DATA KeyedData = { 0 };
BOOL res;
ok(KeyedData.ulLength == data_lenght, "Got lenght %lu instead of %d\n", KeyedData.ulLength, data_lenght);
ok(classData->size == sizeof(*classData), "Got %lu instead of %d\n", classData->size, sizeof(*classData));
ok(classData->res == 0, "Got res %lu\n", classData->res);
- ok(classData->name_len == wcslen(ExpectedClassName) * 2, "Got name len %lu, expected %d\n", classData->name_len, wcslen(ExpectedClassName) *2);
ok(classData->module_len == wcslen(ExpectedModule) * 2, "Got name len %lu, expected %d\n", classData->module_len, wcslen(ExpectedModule) *2);
- ok(wcscmp(VersionedClass, ExpectedClassName) == 0, "Got %S, expected %S\n", VersionedClass, ExpectedClassName);
ok(wcscmp(ClassLib, ExpectedModule) == 0, "Got %S, expected %S\n", ClassLib, ExpectedModule);
+ /* compare only if VersionedClass starts with ExpectedClassPart */
+ ok(memcmp(VersionedClass, ExpectedClassPart, sizeof(WCHAR) * wcslen(ExpectedClassPart)) == 0, "Expected %S to start with %S\n", VersionedClass, ExpectedClassPart);
}
}
START_TEST(FindActCtxSectionStringW)
{
- HANDLE h;
- ULONG_PTR cookie;
+ HANDLE h, h2;
+ ULONG_PTR cookie, cookie2;
/*First run the redirection tests without using our own actctx */
TestClassRedirection(NULL, L"Button", L"Button", L"comctl32.dll", 27);
/* Class redirection tests */
h = _CreateActCtxFromFile(L"classtest.manifest", __LINE__);
- if (h)
+ if (h != INVALID_HANDLE_VALUE)
{
_ActivateCtx(h, &cookie, __LINE__);
TestClassRedirection(h, L"Button", L"2.2.2.2!Button", L"testlib.dll", 5);
+ _ActivateCtx(NULL, &cookie2, __LINE__);
+ TestClassRedirection(NULL, L"Button", L"Button", L"comctl32.dll", 27);
+ _DeactivateCtx(cookie2, __LINE__);
_DeactivateCtx(cookie, __LINE__);
}
else
skip("Failed to create context for classtest.manifest\n");
}
+ /* Class redirection tests with multiple contexts in the activation stack */
+ h2 = _CreateActCtxFromFile(L"classtest2.manifest", __LINE__);
+ if (h != INVALID_HANDLE_VALUE && h2 != INVALID_HANDLE_VALUE)
+ {
+ _ActivateCtx(h, &cookie, __LINE__);
+ _ActivateCtx(h2, &cookie2, __LINE__);
+ TestClassRedirection(NULL, L"Button", L"Button", L"comctl32.dll", 27);
+ TestClassRedirection(h2, L"MyClass", L"1.1.1.1!MyClass", L"testlib.dll", 5);
+ _DeactivateCtx(cookie2, __LINE__);
+ TestClassRedirection(h, L"Button", L"2.2.2.2!Button", L"testlib.dll", 5);
+ _DeactivateCtx(cookie, __LINE__);
+ }
+ else
+ {
+ skip("Failed to create context for classtest.manifest\n");
+ }
+
/* Dependency tests */
h = _CreateActCtxFromFile(L"deptest.manifest", __LINE__);
- if (h)
+ if (h != INVALID_HANDLE_VALUE)
{
_ActivateCtx(h, &cookie, __LINE__);
TestLibDependency(h);
/* Activate a context that depends on comctl32 v6 and run class tests again */
h = _CreateActCtxFromFile(L"comctl32dep.manifest", __LINE__);
- if (h)
+ if (h != INVALID_HANDLE_VALUE)
{
_ActivateCtx(h, &cookie, __LINE__);
- TestClassRedirection(h, L"Button", L"6.0.3790.1830!Button", L"comctl32.dll", 29);
+ TestClassRedirection(h, L"Button", L"6.0.", L"comctl32.dll", 29);
ok( GetModuleHandleW(L"comctl32.dll") == NULL, "Expected comctl32 not to be loaded\n");
ok( GetModuleHandleW(L"user32.dll") == NULL, "Expected user32 not to be loaded\n");
_DeactivateCtx(cookie, __LINE__);