笔者编了一个程序,用来在该程序中启动其他应用程序,代码如下:
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 请问各位大虾,我的程序错误在哪儿?谢谢!

解决方案 »

  1.   

    你怎么建MFC,你建一个控制台程序就可以了。
    然后你调用一个API程序就可以了。CreateProcess()
    你去查一下这个API怎么用!!
    用它就可以了。
      

  2.   

    多谢指教.以下是我的一些补充:
    但我的程序要求有图形化界面,所以用了MFC;
    另外,CreateProcess()这个API我也试过了,所得的结果与上面的类似;
    还有,WinExec()和system()这两个函数我也都试过了,也出现类似的结果.
    上面的程序代码我在一个比较小的程序里试过,没有问题;但是在我原先的程序里(比较大),就出现了上面问题.我想可能与操作系统有关,但不知道,在98下,什么原因可能导致KRML386.EXE的错误?
    多谢!
      

  3.   

    try build in win98 which had display errors.
      

  4.   

    可能我还说得不够详细,以下是一些补充:
    1)我的程序是用于在一个场景中激活功能,场景(较大)用OpenGL编写的;
    2)我的开发平台是:Win98(OEM版),VC6;
    3)我对源代码进行了单步调试,可以一直trace到系统的动态库,而没有错,按下F5键以后才出现错误;我也试图捕获InvokeItemAction()的异常,但是捕获不到任何异常;
      

  5.   

    EAX=c0034eff 
    EBX=165fd3d6
    EDX=81763d31看这几个寄存器的样子,有点像内存越界,或访问了已经释放的空间。类似这种问题不是在Win2000就没有,而是爆发方式与地点完全不同。(不是KRNL386.EXE的错,是传递给KERNAL的参数有问题)如果你确定爆发点在 ShellExecute(NULL,NULL,str,NULL,NULL,SW_SHOW);
    那么错误应该不远。