]> granicus.if.org Git - php/commitdiff
don't expect set/get title symbols are always there
authorAnatol Belski <ab@php.net>
Wed, 18 Mar 2015 19:50:54 +0000 (20:50 +0100)
committerAnatol Belski <ab@php.net>
Wed, 18 Mar 2015 19:50:54 +0000 (20:50 +0100)
sapi/cli/ps_title.c

index 9685666b1b2efdf89c9a8fd2ede774ac9501eccf..2d95e494aa8473e81ebf4abc23a6f7a7716a9b87 100644 (file)
@@ -109,6 +109,8 @@ extern char** environ;
 static char windows_error_details[64];
 static char ps_buffer[MAX_PATH];
 static const size_t ps_buffer_size = MAX_PATH;
+typedef BOOL (WINAPI *MySetConsoleTitle)(LPCTSTR);
+typedef DWORD (WINAPI *MyGetConsoleTitle)(LPTSTR, DWORD);
 #elif defined(PS_USE_CLOBBER_ARGV)
 static char *ps_buffer;         /* will point to argv area */
 static size_t ps_buffer_size;   /* space determined at run time */
@@ -367,8 +369,22 @@ int set_ps_title(const char* title)
 
 #ifdef PS_USE_WIN32
     {
-        if (!SetConsoleTitle(ps_buffer))
+       MySetConsoleTitle set_title = NULL;
+       HMODULE hMod = LoadLibrary("kernel32.dll");
+
+       if (!hMod) {
+            return PS_TITLE_WINDOWS_ERROR;
+       }
+
+       /* NOTE we don't use _UNICODE*/
+       set_title = (MySetConsoleTitle)GetProcAddress(hMod, "SetConsoleTitleA");
+       if (!set_title) {
             return PS_TITLE_WINDOWS_ERROR;
+       }
+
+        if (!set_title(ps_buffer)) {
+            return PS_TITLE_WINDOWS_ERROR;
+       }
     }
 #endif /* PS_USE_WIN32 */
 
@@ -388,8 +404,24 @@ int get_ps_title(int *displen, const char** string)
         return rc;
 
 #ifdef PS_USE_WIN32
-    if (!(ps_buffer_cur_len = GetConsoleTitle(ps_buffer, (DWORD)ps_buffer_size)))
-        return PS_TITLE_WINDOWS_ERROR;
+    {
+       MyGetConsoleTitle get_title = NULL;
+       HMODULE hMod = LoadLibrary("kernel32.dll");
+
+       if (!hMod) {
+            return PS_TITLE_WINDOWS_ERROR;
+       }
+
+       /* NOTE we don't use _UNICODE*/
+       get_title = (MyGetConsoleTitle)GetProcAddress(hMod, "GetConsoleTitleA");
+       if (!get_title) {
+            return PS_TITLE_WINDOWS_ERROR;
+       }
+
+        if (!(ps_buffer_cur_len = get_title(ps_buffer, (DWORD)ps_buffer_size))) {
+            return PS_TITLE_WINDOWS_ERROR;
+       }
+    }
 #endif
     *displen = (int)ps_buffer_cur_len;
     *string = ps_buffer;