我用MFC做了一个基于对话框的应用程序,主对话框的创建就在应用程序实现文件中:
CTvPlayerDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
另外我又在主对话框TvPlayerDlg的实现文件创建另外的对话框:
if (pMsg->wParam == 65)
{
//EPG对话框
if (m_pTvEpgDlg != NULL)
{
delete m_pTvEpgDlg;
m_pTvEpgDlg = NULL;
}
m_pTvEpgDlg = new CNTvEPGDlg;
m_pTvEpgDlg->Create(IDD_DIALOG_TVEPG, NULL);
m_pTvEpgDlg->inputTvDlg(this);
m_pTvEpgDlg->inputPlayCH(m_CH);
}if (pMsg->wParam == 67)
{
//系统设置对话框
if (m_pSystemSet != NULL)
{
delete m_pSystemSet;
m_pSystemSet = NULL;
}
m_pSystemSet = new CNSystemSet;
m_pSystemSet->Create(IDD_DIALOG_SYSTEMSET, NULL);
m_pSystemSet->inputTvDlg(this);
}在启动应用程序,出现主对话框窗口时,和创建IDD_DIALOG_TVEPG,IDD_DIALOG_SYSTEMSET出现其窗口是,或退出这些窗口时都会看到一个带标题栏的窗口闪烁一下,我创建的这些对话框都是没有标题栏的,即对话框的Border属性都是None;我搞不清楚闪烁的对话框是什么窗口,为什么会出现这个一个闪烁的窗口呢,怎么解决这个问题,让这个窗口不会出现,请高手帮忙!谢谢!
CTvPlayerDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
另外我又在主对话框TvPlayerDlg的实现文件创建另外的对话框:
if (pMsg->wParam == 65)
{
//EPG对话框
if (m_pTvEpgDlg != NULL)
{
delete m_pTvEpgDlg;
m_pTvEpgDlg = NULL;
}
m_pTvEpgDlg = new CNTvEPGDlg;
m_pTvEpgDlg->Create(IDD_DIALOG_TVEPG, NULL);
m_pTvEpgDlg->inputTvDlg(this);
m_pTvEpgDlg->inputPlayCH(m_CH);
}if (pMsg->wParam == 67)
{
//系统设置对话框
if (m_pSystemSet != NULL)
{
delete m_pSystemSet;
m_pSystemSet = NULL;
}
m_pSystemSet = new CNSystemSet;
m_pSystemSet->Create(IDD_DIALOG_SYSTEMSET, NULL);
m_pSystemSet->inputTvDlg(this);
}在启动应用程序,出现主对话框窗口时,和创建IDD_DIALOG_TVEPG,IDD_DIALOG_SYSTEMSET出现其窗口是,或退出这些窗口时都会看到一个带标题栏的窗口闪烁一下,我创建的这些对话框都是没有标题栏的,即对话框的Border属性都是None;我搞不清楚闪烁的对话框是什么窗口,为什么会出现这个一个闪烁的窗口呢,怎么解决这个问题,让这个窗口不会出现,请高手帮忙!谢谢!
解决方案 »
- 用VC2围数组写一个棋盘界面?如下图所示。
- 如何调整CFormView滚动条以适应内嵌窗体的大小?
- 我想写个无界面的小程序,答一个也有分!!!
- VC++2010 下面找不到FlexGrid与日历控件
- ATL类为什么不能用new CInterfaceA()得形式实例化?!报纯虚函数QueryInterface()...没有定义
- 简单任务
- 在放置CEdit控件时选用Password属性,运行中想变为Read-only如何写?
- 怎样用ADO获取自增字段的内容,及其它字段的类型,如下代码为何会报错?
- 如何在vbscrip中调用我自己编写的OCX中的函数?
- 函数SHBrowseForFolder()中的问题
- 请问纯C如何创建密码控件,用这个吗?CreateWindowEx,我会创建输入框,但是不知道密码
- 如何对服务器进行压力测试?
CString strAppFullName;
CString strAppPath;GetModuleFileName(AfxGetApp()->m_hInstance, strAppFullName.GetBuffer(MAX_PATH), MAX_PATH);
strAppFullName.ReleaseBuffer();
int nPos = 0;
nPos = strAppFullName.ReverseFind(_T('\\'));
strAppPath = strAppFullName.Left(nPos + 1);这个应用程序自己运行没有任何错误。
可是,现在我把它做成一个MFC扩展DLL
并再做了一个MFC应用程序来调用这个DLL,在程序调用这个DLL后就会出现访问冲突的错误,调试之后程序停留在
上面程序的GetModuleFileName(AfxGetApp()->m_hInstance, strAppFullName.GetBuffer(MAX_PATH), MAX_PATH);求高手指点,调用DLL为什么就会出现这个问题呢?
距离来说,windows下的输入法文件是ime(仅指IME框架下编写的输入法,TSF框架我不太清楚)文件,本质来说就是一个dll文件,不过就是把后缀修改为ime而已。
在输入法运行的时候,ime文件被加载到宿主进程中,例如Office套间中的word,如果你在ime中使用GetModuleFileName这个API的话,它返回的就是word.exe的位置,而不是ime所在的位置。
GetModuleFileName这个API在dll中使用的效果是返回宿主exe文件的绝对路径,而不是dll所在的绝对路径
-------------------------------------------------------------------------------------楼上说的对,那么把它用在API的dll中,要如何才能使它返回DLL所在的绝对路径呢??求楼上在帮帮忙
#include < Windows.h>
添加库文件Kernel32.dll
CString CLocalization::GetCurrWorkingDir(){ CString strPath; TCHAR szFull[_MAX_PATH]; TCHAR szDrive[_MAX_DRIVE]; TCHAR szDir[_MAX_DIR]; ::GetModuleFileName(AfxGetApp()->m_hInstance, szFull, sizeof(szFull)/sizeof(TCHAR)); _tsplitpath(szFull, szDrive, szDir, NULL, NULL); _tcscpy(szFull, szDrive); _tcscat(szFull, szDir); strPath = CString(szFull); return strPath;}
如果是Win32的话,一般的处理方式是在
dll加载的DLLmain函数入口,将当前dll的HINSTANCE保存到dll的全局变量中
BOOL WINAPI DllMain(
[in] HINSTANCE hinstDLL, //这个就是moudlehandle
[in] DWORD fdwReason,
[in] LPVOID lpvReserved
); 然后在调用GetModuleFileName这个API的时候,以保存下来的modulehandle为第一参数,你就可以获得dll所在的绝对路径了。
[code=C++]
HINSTANCE g_hInst = NULL;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
UNREFERENCED_PARAMETER(lpReserved);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hInst=(HINSTANCE)hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
ImeClass_Unregister((HINSTANCE)hModule);
break;
}
return TRUE;
}
......
TCHAR fileRoute[256] = {0};
GetModuleFileName(g_hInst,fileRoute,256);[/code]