gxqcn 发表于 2010-8-31 08:54:47

DLL 中如何检测调用者是 GUI or Console?

在 DLL 中如何检测调用 AP 是图形界面还是命令行模式?
先仅限于 windows (WIN32 及 WIN64)操作系统。

gxqcn 发表于 2010-8-31 09:07:01

搜到一英文网站:How to detect console vs GUI mode from a DLL,里面介绍了两种方案:#include <windows.h>
#include <tchar.h>

int main()
{
    char *base = (char*)GetModuleHandle(0); // "returns a handle to the file used to create the calling process (.exe file)."
    IMAGE_DOS_HEADER *idh = (IMAGE_DOS_HEADER*)(base+0);
    IMAGE_FILE_HEADER *ifh =(IMAGE_FILE_HEADER*)(base+idh->e_lfanew+sizeof(DWORD));
    IMAGE_OPTIONAL_HEADER *ioh =(IMAGE_OPTIONAL_HEADER*)(base+idh->e_lfanew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER)) ;
    //
    const TCHAR *subsystem=0;
    switch (ioh->Subsystem)
    {
      case IMAGE_SUBSYSTEM_UNKNOWN: subsystem=_T("unknown"); break;
      case IMAGE_SUBSYSTEM_NATIVE: subsystem=_T("native"); break;
      case IMAGE_SUBSYSTEM_WINDOWS_CUI: subsystem=_T("console"); break;
      case IMAGE_SUBSYSTEM_WINDOWS_GUI: subsystem=_T("windows"); break;
      case IMAGE_SUBSYSTEM_OS2_CUI: subsystem=_T("os2"); break;
      case IMAGE_SUBSYSTEM_POSIX_CUI: subsystem=_T("posix"); break;
      case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI: subsystem=_T("ce"); break;
      case IMAGE_SUBSYSTEM_XBOX: subsystem=_T("xbox"); break;
      default: subsystem=_T("???");
    }

    MessageBox(0,subsystem,subsystem,MB_OK);

    return 0;
}以及:if(!GetConsoleTitle(NULL, 0) && GetLastError() == ERROR_SUCCESS) {
// CUI
} else {
// GUI
}

wayne 发表于 2010-8-31 10:48:57

windows API 我不了解。
如果是自己写的dll的话,倒很简单,添加一个变量或者函数来指明状态即可

gxqcn 发表于 2010-8-31 10:53:20

DLL 是被调的,它是被动的,如何给这个变量赋值?
这需要自动侦测的。

wayne 发表于 2010-8-31 16:52:00

呵呵,俺不清楚具体是什么dll,不知道dll在这个问题中的角色~~
除了表示关注之外帮不了什么忙了
页: [1]
查看完整版本: DLL 中如何检测调用者是 GUI or Console?