找回密码
 欢迎注册
查看: 7778|回复: 4

[讨论] DLL 中如何检测调用者是 GUI or Console?

[复制链接]
发表于 2010-8-31 08:54:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
在 DLL 中如何检测调用 AP 是图形界面还是命令行模式?
先仅限于 windows (WIN32 及 WIN64)操作系统。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-31 09:07:01 | 显示全部楼层
搜到一英文网站:How to detect console vs GUI mode from a DLL,里面介绍了两种方案:
  1. #include <windows.h>
  2. #include <tchar.h>

  3. int main()
  4. {
  5.     char *base = (char*)GetModuleHandle(0); // "returns a handle to the file used to create the calling process (.exe file)."
  6.     IMAGE_DOS_HEADER *idh = (IMAGE_DOS_HEADER*)(base+0);
  7.     IMAGE_FILE_HEADER *ifh =(IMAGE_FILE_HEADER*)(base+idh->e_lfanew+sizeof(DWORD));
  8.     IMAGE_OPTIONAL_HEADER *ioh =(IMAGE_OPTIONAL_HEADER*)(base+idh->e_lfanew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER)) ;
  9.     //
  10.     const TCHAR *subsystem=0;
  11.     switch (ioh->Subsystem)
  12.     {
  13.         case IMAGE_SUBSYSTEM_UNKNOWN: subsystem=_T("unknown"); break;
  14.         case IMAGE_SUBSYSTEM_NATIVE: subsystem=_T("native"); break;
  15.         case IMAGE_SUBSYSTEM_WINDOWS_CUI: subsystem=_T("console"); break;
  16.         case IMAGE_SUBSYSTEM_WINDOWS_GUI: subsystem=_T("windows"); break;
  17.         case IMAGE_SUBSYSTEM_OS2_CUI: subsystem=_T("os2"); break;
  18.         case IMAGE_SUBSYSTEM_POSIX_CUI: subsystem=_T("posix"); break;
  19.         case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI: subsystem=_T("ce"); break;
  20.         case IMAGE_SUBSYSTEM_XBOX: subsystem=_T("xbox"); break;
  21.         default: subsystem=_T("???");
  22.     }

  23.     MessageBox(0,subsystem,subsystem,MB_OK);

  24.     return 0;
  25. }
复制代码
以及:
  1. if(!GetConsoleTitle(NULL, 0) && GetLastError() == ERROR_SUCCESS) {
  2. // CUI
  3. } else {
  4. // GUI
  5. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-31 10:48:57 | 显示全部楼层
windows API 我不了解。
如果是自己写的dll的话,倒很简单,添加一个变量或者函数来指明状态即可
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-31 10:53:20 | 显示全部楼层
DLL 是被调的,它是被动的,如何给这个变量赋值?
这需要自动侦测的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-31 16:52:00 | 显示全部楼层
呵呵,俺不清楚具体是什么dll,不知道dll在这个问题中的角色~~
除了表示关注之外帮不了什么忙了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-23 15:59 , Processed in 0.055957 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表