VC如何强制结束程序进程

VC如何强制结束程序进程,第1张

如果代码实现的话可以这么写:

void KillProcess(TCHAR target[])

{

    DWORD aps[1024], cbNeeded, cbNeeded2, i;

    TCHAR buffer[256];

    BOOL killed;

    HANDLE hProcess;

    HMODULE hModule;

    

    killed = FALSE;

    

    EnumProcesses(aps, sizeof(aps), &cbNeeded)    for(i = 0; i < cbNeeded/sizeof(DWORD); ++i)

    {

        if(!(hProcess = OpenProcess(PROCESS_TERMINATE |

                                    PROCESS_QUERY_INFORMATION |

                                    PROCESS_VM_READ,FALSE, aps[i])))

            continue;

        if(!EnumProcessModules(hProcess, &hModule, 

                               sizeof(hModule), &cbNeeded2))

            continue;

        GetModuleBaseNameA(hProcess, hModule, buffer, 256);

        if(lstrcmpi(buffer, target) == 0)

        {

            if(TerminateProcess(hProcess, 0))

                killed = TRUE;

            CloseHandle(hProcess);

            break;

        }

        CloseHandle(hProcess);

    }

}

按钮的死循环

你的意思是点击按钮后,界面一直无响应吗

如果是这种情况,程序应该是在后台进行大数据的处理,可以采用多线程来解决

如果是点击按钮,按钮的响应函数是死循环,那只能调试代码了

首先根据进程名找到该进程的ID,如已知某进程的进程名为Applicationexe,可以用列举进程的办法找的该进程的ID(前提是系统中有且只有一个这样的进程):

HANDLE hProcessSnap;

TCHAR ProcessName[]="Applicationexe";

DWORD ProcessID=0x00;

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if(hProcessSnap==INVALID_HANDLE_VALUE)

{

printf("列举进程失败\n");

return ;

}

PROCESSENTRY32 pe32;

pe32dwSize = sizeof(pe32);

BOOL bProcess = Process32First(hProcessSnap, &pe32);

TCHAR buff[1024];

while(bProcess)

{

if(strcmp(ProcessName,pe32szExeFile)==0)

{

ProcessID= pe32th32ProcessID;

break;

}

memset(buff, 0x00, 1024);

bProcess=Process32Next(hProcessSnap, &pe32);

}

if(ProcessID==0)

{

printf("没有找到进程%s", ProcessName);

return;

}

然后把ProcessID作为参数,按照下面这篇文章所说的方法得到该进程的主窗口句柄:>

首先你得定义int g=DETECT,m=VGA;

然后用注册图形驱动registerbgidriver(EGAVGA_driver);(注册图形可有可无具体而定)

最后初始化 initgraph(&g,&m,"");

下面的程序在win-tc下编译通过,楼主可以参考下

#include<stdlibh>

#include<stringh>

#include<graphicsh>

void main()

{

int i,y[12],shu[12],j,n=0,k=1,p=500,s;

char ch[3]="0",zhi[3];

registerbgidriver(EGAVGA_driver);(

initgraph(&g,&m,"");

rectangle(10,5,633,459);

for(n=0;n<12;n++)

do{ y[n]=random(getmaxy());

}while(y[n]>450||y[n]<12);

for(i=0;i<12;i++)

{shu[i]=y[i];

}

for(i=1;i<12;i++)

{ m=i;s=0;

for(j=1;j<12;j++) if(shu[j]>=shu[m]&&shu[j]>12) { m=j;s=1;}

if(s==1) shu[m]=k++;

}

n=0;

for(i=10;i<633;i+=52)

{ line(i,450,i,459);

if(i!=10)

{ bar(i-10,y[n],i+10,459); sprintf(zhi,"%d",shu[n]);outtextxy(i-5,y[n]-10,zhi);}

sprintf(ch,"%d",n++);

outtextxy(i-2,462,ch);

}

getch();

}

DOS中断中断属于汇编层面的内容,可以用asm内联实现:

在windows visual c++下用__asm关键字。

在gcc下用__asm__宏即可。

示例(vc):

#include <stdioh>

int main()

{

__asm int 3h;

return 0;

}

这样就可以在C里面写入汇编代码了。

__asm 关键字用于调用内联汇编程序,并且可在 C 或 C++ 语句合法时出现。 它不能单独出现。 必须后跟汇编指令、一组在大括号中的命令、或者至少一对空大括号。 术语 “__asm 块”在此处指任何命令或命令组,不管是否在大括号内。

如果不与大括号一起使用,则 __asm 关键字表示此行的其余部分是一条汇编语言语句。 如果与大括号一起使用,则该关键字表示大括号之间的每一行都是一条汇编语言语句。为了与早期版本兼容,_asm 是 __asm 的同义词。

由于 __asm 关键字是语句分隔符,因此您可以将程序集指令放在同一行中。

在 Visual C++ 2005 之前,指令

__asm int 3

不会导致在使用 /clr 编译时生成本机代码;编译器会将该指令转换为 CLR 中断指令。

__asm int 3 现在将导致为函数生成本机代码。 如果您希望函数导致代码中出现断点,还希望将函数编译为 MSIL,请使用 __debugbreak。

以上就是关于VC如何强制结束程序进程全部的内容,包括:VC如何强制结束程序进程、vc 如何中断按钮的死循环、VC 关闭 进程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10102804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存