找回密码
 欢迎注册
查看: 13185|回复: 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-12-22 14:23 , Processed in 0.024571 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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