笔者编了一个程序,用来在该程序中启动其他应用程序,代码如下:
void CMainFrame::InvokeItemAction(int nIndex)
{
CMyApp* pApp=(CMyApp*)AfxGetApp();//我的应用程序类
this->ShowWindow(SW_MINIMIZE); CString str;
str=pApp->m_pItem[nIndex].m_pszItemAction;//m_pItem为SItem类型,具体定义见下文
if(((WORD)::ShellExecute(NULL,NULL,str,NULL,NULL,SW_SHOW))<=32)//第一个参数原为this->GetSafeHwnd()
{
AfxMessageBox("执行出错!\n请检查您安装是否正确\n或者您是否删除了安装目录下的相关文件。");
}}struct SItem
{
... ...
WCHAR m_pszItemAction[50];//这里要读数据库,所以用了WCHAR类型
... ...
};
在CMyApp类中,有如下定义
class CMyApp:public CWinApp
{
... ...
public:
SItem* m_pItem;
... ...
};该程序在Win2k下运行,一切正常,但是在有的Win98版本下,就出现下面的错误
KRML386.EXE中导致常规保护错误
Registers:
EAX=c0034eff CS=595f EIP=00000f1b EFLGS=00000292
EBX=165fd3d6 SS=4e4f ESP=000085c6 EBP=00008602
ECX=00034e4f DS=4e4f ESI=000304e8 FS=532f
EDX=81763d31 ES=4e4f EDI=00030001 GS=0000
Bytes at CS:EIP:
1f 66 68 00 00 03 00 ea d8 78 4f 01 00 00 00 f2
Stack dump:
1737a915 2aee0000 00005917 0c20001c 00030001 00028656 8b6a1637 00001737 59172aee 001c0000 000304e8 b1144e4f 4e4f14d0 000304e8 59172aee 6705861a 请问各位大虾,我的程序错误在哪儿?谢谢!
void CMainFrame::InvokeItemAction(int nIndex)
{
CMyApp* pApp=(CMyApp*)AfxGetApp();//我的应用程序类
this->ShowWindow(SW_MINIMIZE); CString str;
str=pApp->m_pItem[nIndex].m_pszItemAction;//m_pItem为SItem类型,具体定义见下文
if(((WORD)::ShellExecute(NULL,NULL,str,NULL,NULL,SW_SHOW))<=32)//第一个参数原为this->GetSafeHwnd()
{
AfxMessageBox("执行出错!\n请检查您安装是否正确\n或者您是否删除了安装目录下的相关文件。");
}}struct SItem
{
... ...
WCHAR m_pszItemAction[50];//这里要读数据库,所以用了WCHAR类型
... ...
};
在CMyApp类中,有如下定义
class CMyApp:public CWinApp
{
... ...
public:
SItem* m_pItem;
... ...
};该程序在Win2k下运行,一切正常,但是在有的Win98版本下,就出现下面的错误
KRML386.EXE中导致常规保护错误
Registers:
EAX=c0034eff CS=595f EIP=00000f1b EFLGS=00000292
EBX=165fd3d6 SS=4e4f ESP=000085c6 EBP=00008602
ECX=00034e4f DS=4e4f ESI=000304e8 FS=532f
EDX=81763d31 ES=4e4f EDI=00030001 GS=0000
Bytes at CS:EIP:
1f 66 68 00 00 03 00 ea d8 78 4f 01 00 00 00 f2
Stack dump:
1737a915 2aee0000 00005917 0c20001c 00030001 00028656 8b6a1637 00001737 59172aee 001c0000 000304e8 b1144e4f 4e4f14d0 000304e8 59172aee 6705861a 请问各位大虾,我的程序错误在哪儿?谢谢!
解决方案 »
- select * from 表名 where 条件,“条件”的格式
- vc 串口丢数
- 一个进程中的多个线程可以在多核处理器上的 不同核上运行吗?
- vc6 unicode下oo4o 存储Clob
- GetPrivateProfileString和WritePrivateProfileString问题???
- 在全屏DX中不用DirectInput和消息,怎么获得鼠标消息
- 为什么MSDN的许多例子在Win32 Debug Unicode或Win32 Release Unicode配置下在WIN98中运行出错
- 数据结构
- 急<<<<<<<<<<国内谁的虚拟主机好?尤其在境外访问时
- about ImageList
- 急!VC++7(.net)如何调用ClassWizard?如何添加消息映射函数?
- 高分寻求使CSocket在worker线程中工作的源代码!
然后你调用一个API程序就可以了。CreateProcess()
你去查一下这个API怎么用!!
用它就可以了。
但我的程序要求有图形化界面,所以用了MFC;
另外,CreateProcess()这个API我也试过了,所得的结果与上面的类似;
还有,WinExec()和system()这两个函数我也都试过了,也出现类似的结果.
上面的程序代码我在一个比较小的程序里试过,没有问题;但是在我原先的程序里(比较大),就出现了上面问题.我想可能与操作系统有关,但不知道,在98下,什么原因可能导致KRML386.EXE的错误?
多谢!
1)我的程序是用于在一个场景中激活功能,场景(较大)用OpenGL编写的;
2)我的开发平台是:Win98(OEM版),VC6;
3)我对源代码进行了单步调试,可以一直trace到系统的动态库,而没有错,按下F5键以后才出现错误;我也试图捕获InvokeItemAction()的异常,但是捕获不到任何异常;
EBX=165fd3d6
EDX=81763d31看这几个寄存器的样子,有点像内存越界,或访问了已经释放的空间。类似这种问题不是在Win2000就没有,而是爆发方式与地点完全不同。(不是KRNL386.EXE的错,是传递给KERNAL的参数有问题)如果你确定爆发点在 ShellExecute(NULL,NULL,str,NULL,NULL,SW_SHOW);
那么错误应该不远。