[COM_APITEST] Add a test for CLSID_ActiveDesktop
[reactos.git] / modules / rostests / apitests / kernel32 / GetModuleFileName.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for GetModuleFileName
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8 #include "precomp.h"
9
10 #include <shlwapi.h>
11
12 static
13 VOID
14 StartChild(char **argv)
15 {
16 BOOL Success;
17 WCHAR Path[MAX_PATH];
18 PWSTR FileName;
19 PWSTR Slash;
20 WCHAR CommandLine[MAX_PATH];
21 STARTUPINFOW StartupInfo;
22 PROCESS_INFORMATION ProcessInfo;
23 DWORD Ret;
24 int Length;
25
26 Length = MultiByteToWideChar(CP_ACP,
27 0,
28 argv[0],
29 -1,
30 Path,
31 sizeof(Path) / sizeof(WCHAR));
32 ok(Length > 0, "Length = %d\n", Length);
33
34 FileName = wcsrchr(Path, '\\');
35 Slash = wcsrchr(Path, L'/');
36 if (Slash && (!FileName || Slash > FileName))
37 FileName = Slash;
38
39 if (FileName)
40 {
41 /* It's an absolute path. Set it as current dir and get the file name */
42 FileName++;
43 FileName[-1] = L'\0';
44
45 Success = SetCurrentDirectoryW(Path);
46 ok(Success == TRUE, "SetCurrentDirectory failed for path '%ls'\n", Path);
47
48 trace("Starting '%ls' in path '%ls'\n", FileName, Path);
49 }
50 else
51 {
52 FileName = Path;
53 trace("Starting '%ls', which is already relative\n", FileName);
54 }
55
56 swprintf(CommandLine, L"\"%ls\" GetModuleFileName relative", FileName);
57
58 RtlZeroMemory(&StartupInfo, sizeof(StartupInfo));
59 StartupInfo.cb = sizeof(StartupInfo);
60
61 Success = CreateProcessW(FileName,
62 CommandLine,
63 NULL,
64 NULL,
65 FALSE,
66 0,
67 NULL,
68 NULL,
69 &StartupInfo,
70 &ProcessInfo);
71 if (!Success)
72 {
73 skip("CreateProcess failed with %lu\n", GetLastError());
74 return;
75 }
76 CloseHandle(ProcessInfo.hThread);
77 Ret = WaitForSingleObject(ProcessInfo.hProcess, 30 * 1000);
78 ok(Ret == WAIT_OBJECT_0, "WaitForSingleObject returns %lu\n", Ret);
79 CloseHandle(ProcessInfo.hProcess);
80 }
81
82 static
83 VOID
84 TestGetModuleFileNameA(VOID)
85 {
86 CHAR Buffer[MAX_PATH];
87 DWORD Length;
88 BOOL Relative;
89
90 Length = GetModuleFileNameA(NULL, Buffer, sizeof(Buffer));
91 ok(Length != 0, "Length = %lu\n", Length);
92 ok(Length < sizeof(Buffer), "Length = %lu\n", Length);
93 ok(Buffer[Length] == 0, "Buffer not null terminated\n");
94 Relative = PathIsRelativeA(Buffer);
95 ok(Relative == FALSE, "GetModuleFileNameA returned relative path: %s\n", Buffer);
96 }
97
98 static
99 VOID
100 TestGetModuleFileNameW(VOID)
101 {
102 WCHAR Buffer[MAX_PATH];
103 DWORD Length;
104 BOOL Relative;
105
106 Length = GetModuleFileNameW(NULL, Buffer, sizeof(Buffer) / sizeof(WCHAR));
107 ok(Length != 0, "Length = %lu\n", Length);
108 ok(Length < sizeof(Buffer) / sizeof(WCHAR), "Length = %lu\n", Length);
109 ok(Buffer[Length] == 0, "Buffer not null terminated\n");
110 Relative = PathIsRelativeW(Buffer);
111 ok(Relative == FALSE, "GetModuleFileNameW returned relative path: %ls\n", Buffer);
112 }
113
114 START_TEST(GetModuleFileName)
115 {
116 int argc;
117 char **argv;
118
119 argc = winetest_get_mainargs(&argv);
120 if (argc < 3)
121 StartChild(argv);
122 else
123 {
124 TestGetModuleFileNameA();
125 TestGetModuleFileNameW();
126 }
127 }