DLL 中如何检测调用者是 GUI or Console?
在 DLL 中如何检测调用 AP 是图形界面还是命令行模式?先仅限于 windows (WIN32 及 WIN64)操作系统。 搜到一英文网站: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
} windows API 我不了解。
如果是自己写的dll的话,倒很简单,添加一个变量或者函数来指明状态即可 DLL 是被调的,它是被动的,如何给这个变量赋值?
这需要自动侦测的。 呵呵,俺不清楚具体是什么dll,不知道dll在这个问题中的角色~~
除了表示关注之外帮不了什么忙了
页:
[1]