如题!
这是为什么?在vc中执行程序的结果是对的,直接双击可执行程序后执行结果是错的。
这两者执行有什么区别吗?
希望大家谈谈自己的想法!

解决方案 »

  1.   

    我的程序中使用了lib,难道和这个有关系吗?大家帮帮忙
      

  2.   

    是的  你用  Ctrl+F5  的时候  你的应用程序  也就是 .exe程序 虽然是在 Debug文件夹或者Release文件里面  而你的lib和dll文件是放在和 Debug同一个等级的目录里面的    这个是正确的而你直接从Debug文件夹里面双击 .exe程序的时候  因为你的Debug文件夹里面没有 lib和dll文件 所以dll和lib文件夹里面的语句没有执行到
    所以你直接双击的时候需要把dll lib文件放在和exe同一个路径下面  应该是这样的
      

  3.   

    直接双击可执行程序后执行结果是错的
    ===================================
    什么是错的呢?
    对的又是什么?
    有什么提示么?比如错误信息什么的是不是少什么dll了?
      

  4.   

    to:rollrock1987我没有用dll文件,只用了lib文件,lib应该在编译的时候已经编译过了。这种错误我还是第一次碰到!大家帮帮忙。共同讨论下
      

  5.   

    to : moonzero我做的是一个类似任务管理器的程序,在vc中执行后我和windows自带的任务管理器相比较数据是对的。如果直接双击执行数据显示不对。如果有可能哪位大哥帮我看看代码?
      

  6.   

    to:rollrock1987没使用相对路径,就在工程目录下有个lib,
    #pragma comment( lib, "PSAPI.LIB" ),通过这个语句使用lib
      

  7.   

    我试过了,Release 和debug都是一样的结果
      

  8.   


    如果是这个原因的话,楼主的程序应该没法正常启动。因为隐式连接的DLL不在当前目录或者系统目录下。
      

  9.   

    两种运行方式,程序的当前目录不同。
    你可以改一下项目属性中调试的设置,把工作目录改为Debug目录,然后调试程序,看看哪里出错。注意与文件有关的函数,包括LoadLibrary。另外,也有可能是你调用的DLL里面出错,注意一下DLL函数的调用。
      

  10.   


    void CProcessMgDlg::UpdateProcess()
    {
    // UpdateData(TRUE); CSortListCtrl * listCtrl=&(((CPRCESSINFO*)m_tabMyTabCtrl.m_tabPages[0])->m_listPrcInfo);
    listCtrl->DeleteAllItems();

    DWORD idxList=1;
    int nCount=0;
    char szCount[56];
    char szID[56];
    HANDLE hProcess; PROCESSENTRY32 pe32;
    PROCESS_MEMORY_COUNTERS pmCounters;
    pe32.dwSize = sizeof(pe32);
    pmCounters.cb=sizeof(PROCESS_MEMORY_COUNTERS);

    HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(hProcessSnap==INVALID_HANDLE_VALUE)
    {
    MessageBox("CreateToolhelp32Snapshot调用失败","Warning");
    return;
    }
    BOOL bMore=::Process32First(hProcessSnap,&pe32);
    while(bMore)
    {
    wsprintf(szID,"%u",pe32.th32ProcessID);
    wsprintf(szCount,"%u",pe32.cntThreads);
    hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);
    GetProcessMemoryInfo(hProcess,&pmCounters,sizeof(PROCESS_MEMORY_COUNTERS));
    CString sTemp,sTemp1;
    sTemp1=pe32.szExeFile;
    sTemp.Format("%d",pmCounters.WorkingSetSize/1024);
    if(sTemp1=="[System Process]")
    sTemp=" ";
    listCtrl->AddItem(pe32.szExeFile,szID,_T(sTemp),"CPU",GetProcessPriority(hProcess),szCount,GetProcessPath(pe32.th32ProcessID));
    nCount++;
    bMore = ::Process32Next(hProcessSnap,&pe32);
    }
    m_nProcssNum=nCount;
    m_csNum.Empty();
    m_csNum.Format("系统当前进程列表(目前共%d进程)",m_nProcssNum);
    UpdateData(false); ::CloseHandle(hProcessSnap);
    }
      

  11.   

    如果哪位愿意一起讨论加我qq:125708500
    或者放出你的qq我会加你
      

  12.   

    GetProcessPath和GetProcessPriority这两个函数是自定义的,用来获取进程路径和进程优先级
      

  13.   


    Note:列举线程的误区 就是使用 OpenProcess 的调用
    该函数没有足够的权限打开其他用户的进程和其他特殊进程而下面的函数则不存在上述问题
    Process32First()
    Process32Next()
    Module32First()
    Module32Next()
      

  14.   

    你粘贴出来的代码,我没看出来有什么毛病
    双击exe还能运行,但是得到的结果不正确,是这样的吗?
      

  15.   

    你是说UpdateProcess这个函数运行不正确吗?具体表现是怎么样?
      

  16.   

    我觉得是程序权限的问题,好像Debug时程序的权限比双击执行时的要高,所以Debug时可以获取的一些信息在双击执行时就获取不到了!
    我以前自己做着玩的一个东西也遇到过这样的问题,双击执行时获取不到的进程路径在Debug时就可以获取到,不过我没去解决它。
      

  17.   

    to: hityct1下面这张图片是直接双击exe运行后的错误画面:
    这张图片是在通过vc运行exe后的正确画面:我观察了下,数据显示错误的好像都是系统的进程!就是内存、优先级、进程路径显示不正确。
      

  18.   

    to: hityct1下面这张图片是直接双击exe运行后的错误画面:
    这张图片是在通过vc运行exe后的正确画面:我观察了下,数据显示错误的好像都是系统的进程!就是内存、优先级、进程路径显示不正确。
      

  19.   

    to:pretender_9我的工程设置里的运行参数是空白的 - - !
      

  20.   

    看起来是OpenProcess失败了,判断一下返回值,如果失败看看错误码是什么。你的操作系统和用户身份是什么?如果是权限问题,并且是管理员身份,可以加上调整权限的代码试试。
    另外,我前面说的把调试运行的工作目录改成Debug然后调试,你试过了吗?
      

  21.   


    xp的系统,用户身份是管理员。怎么加调整权限的代码?“我前面说的把调试运行的工作目录改成Debug然后调试”这个怎么设置?我是菜鸟,呵呵
      

  22.   

    就是在项目属性中,“调试”设置里面,有一项“工作目录”,在后面填入Debug目录的完整路径。
    先确定是不是OpenProcess失败,看一下错误码是什么。
      

  23.   


    不管用,不过还是谢谢你。问题已经解决了,在这里谢谢大家了!!!原来是进程权限的问题:就像hewok所说的Debug时程序的权限比双击执行时的要高,所以我加了一下代码就ok了
    BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
    {
    TOKEN_PRIVILEGES tkp;

    LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
    tkp.PrivilegeCount=1;
    tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限

    return( (GetLastError()==ERROR_SUCCESS) );
    }这个函数用来提升程序权限。
    这种问题还真是难解决,呵呵! 再次感谢大家的热心帮助,助大家国庆节快乐 :)
      

  24.   

    Debugger Users组比Administrators组权限大?
      

  25.   


    这个不知道。
    但是,Debugger Administrators肯定比Administrators组权限大
      

  26.   


    在我的电脑上没有看到Debugger Administrators这个组
      

  27.   

    我不是很明白你说的“Debugger Users组比Administrators组权限大”是什么意思,我的理解是计算机当前使用者是管理员和用户,对吗?
      

  28.   

    不是用户群组的问题,是VC进程具有SeDebugPrivilege权限,它加载的进程默认继承了VC进程的权限。
      

  29.   

    应该是release和debug的问题吧...
      

  30.   

    如果进程没有SeDebugPrivilege权限,调用OpenProcess打开其它进程时就会失败。
      

  31.   


    不是realease和debug的问题,在realease下还是会有那样的问题
      

  32.   


    EnablePrivilege(hToken,SE_DEBUG_NAME),这是函数的参数。
    VC进程具有SeDebugPrivilege权限,那为什么生成的exe就没有?
      

  33.   

    权限是进程的概念,与exe文件无关。例如同一个exe文件,在管理员身份下运行正常,在受限用户身份下可能无法正常运行。
    一个进程加载子进程的时候,可以指定子进程的权限,如果没有指定,则默认与当前进程具有相同的权限。
      

  34.   


    在vc中运行exe,exe会获得和vc进程相同的权限,所以获得的信息没有出错;而双击直接运行时权限太低,所以些获得的有权限限制的信息有错;
    我通过EnablePrivilege这个函数设置了exe进程的权限,我这样理解对吗?
      

  35.   

    差不多是你理解的样子。
    调用OpenProcess打开其它进程时,当前进程需要具有SeDebugPrivilege权限才能成功。在某些系统环境下,进程在一启动时就具有这个权限;而某些系统环境则不具有这个权限,但可以通过AdjustTokenPrivileges调整进程的权限,使自己具有SeDebugPrivilege权限。VC的进程本身具有这个权限,通过VC加载的进程从VC那里继承了这个权限,所以调用OpenProcess可以成功;在你的系统环境下,直接双击加载的进程没有这个权限,所以要自己调用AdjustTokenPrivileges调整一下,然后再调用OpenProcess才能成功。