VC++本机枚举进程,编译环境vs 2008

news/2024/7/10 5:46:51 标签: vc++, buffer, path, windows, command, delete

第一次写这个程序时,出现一种问题,windows报错如下所示:

Windows has triggered a breakpoint in ThreadTest.exe.

This may be due to a corruption of the heap, which indicates a bug in ThreadTest.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while ThreadTest.exe has focus.

The output window may have more diagnostic information.

当时我和我的一个同学是如何都分析不出来,到底错在哪里了,知道是内存溢出了,可不知道为什么会这样,后来我们才知道原来是下面这个函数中的GetBuffer(MAX_PATH)我们写成了GetBuffer(0),导致内存泄露

    DWORD result =  GetModuleFileNameEx(hHandle,AfxGetInstanceHandle(),Name.GetBuffer(MAX_PATH),MAX_PATH);

CString CThreadTestView::ExtractFilePath(CString fName)
{
 CString str;
 //str = fName;
 str.Format("%s",fName);
 int pos = str.ReverseFind('//');
 int len = str.GetLength();
 str.Delete(0,pos);
 AfxMessageBox(str,MB_OK);
 return str;
}
typedef  BOOL (__stdcall* funEnumProcesses)( DWORD * lpidProcess, DWORD cb, DWORD * cbNeeded );
typedef DWORD (__stdcall* funGetModuleFileNameEx) (HANDLE hProcess,    HMODULE hModule,    LPTSTR lpFilename,   DWORD nSize  );

 

void CThreadTestView::OnClicked()
{
 // TODO: Add your command handler code here
  CString exeName=("msdev.exe");
// m_ExeName.GetWindowText(exeName);
 //m_Result.SetWindowText("");
 if (exeName.IsEmpty())
 {
  MessageBox("请输入文件名称");
  return;
 }
 DWORD *buffer,size,num;
 size   = MAXPROCESSES;
 buffer = new DWORD[size];
 num    = MAXPROCESSES;

 HINSTANCE hInstance = LoadLibrary("psapi.dll");
 
 CString Name = "";

 if (hInstance)
 {
  funEnumProcesses EnumProcesses = (funEnumProcesses)GetProcAddress(hInstance,"EnumProcesses");
  if (EnumProcesses)
  {
   BOOL ret = EnumProcesses(buffer,size,&num);
   
   if (ret)
   {
    DWORD factnum = num/sizeof(DWORD);
    funGetModuleFileNameEx GetModuleFileNameEx = (funGetModuleFileNameEx)GetProcAddress(hInstance,"GetModuleFileNameExA");   
    if (GetModuleFileNameEx)
    {
     for (int i = 0; i<factnum; i++)
     {
      HANDLE hHandle  =  OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,false,buffer[i]);
      if (hHandle)
      {
       DWORD result =  GetModuleFileNameEx(hHandle,AfxGetInstanceHandle(),Name.GetBuffer(MAX_PATH),MAX_PATH);
       //Name.ReleaseBuffer();
       if (result)
       {
        //出除文件路径
        CString shName = ExtractFilePath(Name);
        Name.ReleaseBuffer();
        if (exeName==shName)
        {
          AfxMessageBox("该程序已经运行",MB_OK);
          //break;
        // m_Result.SetWindowText("该程序已经运行"); 
       
        }
       
       }
       //关闭句柄
       CloseHandle(hHandle);
      }
     }
    }
   }
  }
  FreeLibrary(hInstance);
 }
 delete buffer;
}


http://www.niftyadmin.cn/n/954225.html

相关文章

VC++ Unicode下的编程 SendMessage

Use Unicode Character Set与Use Multi-Byte Character Set下的编程是完全不同的&#xff0c;自我认为Unicode 比较让人头疼&#xff01; 下面&#xff0c;我写了一个改变窗口标题的小程序&#xff1a; BOOL CALLBACK EnumWindowProc(HWND hwnd,LPARAM lParam);void CqwDlg::…

VC 将位图放到计算机桌面上

我想把位图贴到计算机桌面上&#xff0c;可是做了好久&#xff0c;都未实现&#xff0c;网上的帖子浏览无数&#xff0c;不是太难了&#xff0c;就是一帮只会吹牛&#xff0c;不会实干家伙的胡说&#xff0c;于是自己拿起了《windos程序设计》狂翻&#xff0c;于是找到答案&…

c# 集合(二)-- IEnumerable与IEnumerator

C#中IEnumerable与IEnumerator接口定义了对集合的简单迭代。IEnumerable是一个声明式的接口&#xff0c;声明实现该接口的类是“可迭代&#xff08;enumerable&#xff09;”的&#xff0c;但并没有说明如何实现“迭代器&#xff08;iterator&#xff09;”。IEnumerator是一个…

C#类

1、C#支持隐式转换&#xff0c;但前提是要求不损失精度&#xff0c;否则就要求必须是显示类型转换 2、注意Console.WriteLine()和Console.Write()的区别 3、软件对象是一种将状态数据和行为合成到一起的软件构造&#xff0c;用来描述真是世界的一个概念性的对象。 4、C#的Pa…

#pragma DATA_SECTION

#pragma DATA_SECTION 今天读DSP的图像采集程序&#xff0c;遇到了一点陌生的东西&#xff1a; ti的帮助文档里是这么讲的: The DATA_SECTION pragma allocates space for the symbol in a section called section name. The syntax for the pragma in C is: #pragma DATA_SECT…

TI C64X DSP中断向量表的配置(硬件中断)

TI C64X DSP中断向量表的配置&#xff08;硬件中断&#xff09; 收藏 1. 编写中断服务例程 在.c源文件中编写ISR函数c_intXX&#xff0c;用于中断处理&#xff0c;如&#xff1a; interrupt void c_intXX (void) { …; } 注&#xff1a;对于硬件中断而言&#xff0c;XX 00~15。…

关于zend optimizer与zend debugger共存的问题

现在论坛上&#xff0c;有很多帖子&#xff0c;说zend optimizer与zend debugger按照他们的方法可以很容易就安装上去&#xff0c;但是不幸的是我试了很多次&#xff0c;不是zend optimizer用了而zend debugger没了&#xff0c;反之....,反正两者在他们的安装方法下无法共存&am…

preg_match_all

下面是PHP Manual中的内容 preg_match_all preg_match_all — Perform a global regularexpression match Report a bug Description int preg_match_all ( string $pattern ,string $subject [, array &$matches [, int $flags PREG_PATTERN_ORDER [,int $offset 0 ]]]…