怎样让我的程序在强行关掉时出现“无法完成操作,串绑定无效”

钛哥 2002-07-20 03:23:07
注册成服务器模式好像不行
...全文
72 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
钛哥 2002-07-21
  • 打赏
  • 举报
回复
另外,我发现不能杀掉的进程用ctrl+alt+del键 通过任务管理器来关闭应用程序时出现“无法完成操作,串绑定无效”
钛哥 2002-07-21
  • 打赏
  • 举报
回复
漏了一个
#include <tlhelp32.h>
钛哥 2002-07-21
  • 打赏
  • 举报
回复
季老大有一篇文章,号称可以杀掉一切知道名字的进程,我一个个的试,发现有些不能杀掉,不知道他们怎么做的?不过肯定不是楼上的办法。

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

BOOL EnumProcess(DWORD dwPID, LPCSTR ExeName)
{
BOOL bRet;
char *File;
char buf[512];
String sModule;
HANDLE hModuleSnap;
MODULEENTRY32 me32;

bRet = FALSE;
hModuleSnap = CreateToolhelp32Snapshot(
TH32CS_SNAPMODULE, dwPID);
if (hModuleSnap == (HANDLE)-1)
return FALSE;
memset(&me32, 0, sizeof(me32));
me32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hModuleSnap,&me32)) {
do {
GetFullPathName(me32.szExePath,
sizeof(buf), buf, &File);
sModule = buf;
sModule = sModule.LowerCase();
// ExeName = ExeName.LowerCase();
if (sModule.Pos(ExeName) > 0) {
bRet = TRUE;
break;
}
}
while(Module32Next(hModuleSnap, &me32));
}
CloseHandle(hModuleSnap); return bRet;
}

BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam)
{
DWORD dwID;

GetWindowThreadProcessId(hwnd, &dwID);
if (dwID == (DWORD)lParam) {
PostMessage(hwnd, WM_QUIT, 0, 0);
return FALSE;
}
return TRUE;
}

void KillProgram(LPCSTR ExeName)
{
char *File;
char FullName[512];
HANDLE hProcessSnap;
PROCESSENTRY32 pe32;

if (!ExeName || !ExeName[0])
return;
hProcessSnap = CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == (HANDLE)-1) return;

memset(&pe32, 0, sizeof(pe32));
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32))
{
MODULEENTRY32 me32;
GetFullPathName(ExeName, sizeof(FullName), FullName, &File);
do {
memset(&me32, 0, sizeof(me32));
me32.dwSize = sizeof(me32);
if (EnumProcess(pe32.th32ProcessID,
ExeName)) {
//这儿在EnumWinProc里通过给主窗口
//发消息WM_QUIT使程序退出
EnumWindows((WNDENUMPROC)EnumWinProc,
pe32.th32ProcessID);
//*如果用发消息WM_QUIT不行的话
TerminateProcess(OpenProcess(
PROCESS_ALL_ACCESS,0,pe32
.th32ProcessID), 0);
//*/
}
}
while(Process32Next(hProcessSnap,&pe32));
}
CloseHandle(hProcessSnap);
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
KillProgram(Edit1->Text.LowerCase().c_str());
}
//---------------------------------------------------------------------------
  • 打赏
  • 举报
回复
:)
kingcaiyao 2002-07-20
  • 打赏
  • 举报
回复
To cker:
如果用户在程序中模拟这个退出按钮的单击,那么bNormal标志一样会设置成TURE,表明是正常退出。
  • 打赏
  • 举报
回复
那他要是向这个按钮发消息模拟按下来推出呢?....:)
kingcaiyao 2002-07-20
  • 打赏
  • 举报
回复
我考虑两种情况来实现你的要求。
1.当我们认定用户按下ctrl+alt+del键,通过任务管理器来关闭应用程序是一种强行关闭的操作时,我们可以采取如下措施:
class TForm1:public TForm
{
private:
bool bNoraml;
定义一布尔类型变量来判断用户是否是强行关闭。
public:
protected:
virtual __fastcall ~TForm1();
}
.cpp File
//Constructor
//Deconstructor
void __fastcall TForm1::FormCreate(TObject *Sender)
{
bNormal=FALSE;//初始值设定为假。
}
__fastcall TForm1::~TForm1()
{
if(!bNormal)
{
ShowMessage("无法完成操作,串绑定无效,系统异常中止");
}
}
//这里要注意的是当用户正常退出时,要将bNormal设置成为true
假定正常退出是从单击一按钮或单击一菜单(这里假定是按钮吧)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int button=Application->MessageBox("Do you really want to exit thisform?”,"Confirmation",MB_YESNO+MB_ICONQEUSTION);
if(button==IDYES)
{
bNormal=TRUE;//表明用户是正常退出
}
}
2.假定用户从开始菜单进行关机重启或注销为强行关闭操作,应该采取下列措施:原理和1类似,不过上例中我用析构函数,这里我用消息
class TForm1:public TForm
{
private:
bool bNormal;
void __fastcall WMQueryEndSession(TMessage &Message);
public:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_QUERYENDSESSION,TMessage,WMQueryEndSession);
END_MESSAGE_MAP(TForm);
protected:
virtual void __fastcall WndProc(TMessage &Message);
}
.cpp File
//Constructor
...
void __fastcall TForm1::FormCreate(TObject *Sender)
{
bNormal=FALSE;
}

void __fastcall TForm1::WMQueryEndSession(TMessage &Message)
{
if(!bNormal)
{
ShowMessage("无法完成操作,串绑定无效,程序异常中止");
}
Message.Result=1;
Dispatch(&Message);
}
void __fastcall TForm1::WndProc(TMessage &Message)
{
//Do my job
TForm::WndProc(Message);
}
//正常退出
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int button=Application->MessageBox("Do you really want to exit thisform?”,"Confirmation",MB_YESNO+MB_ICONQEUSTION);
if(button==IDYES)
{
bNormal=TRUE;//表明用户是正常退出
}
}



talisman 2002-07-20
  • 打赏
  • 举报
回复
什么意思?
kingcaiyao 2002-07-20
  • 打赏
  • 举报
回复
你所指的强行关闭是指的哪一种,是用户按下CTRL+ALT+DEL,还是用户重启或注销或关闭Windows系统,你必须考虑全面。
huzhangyou 2002-07-20
  • 打赏
  • 举报
回复
我乱说的
呵呵
learning......................................
huzhangyou 2002-07-20
  • 打赏
  • 举报
回复
不知道你看过cih没有
进到ring0后好像管不了
钛哥 2002-07-20
  • 打赏
  • 举报
回复
再顶
钛哥 2002-07-20
  • 打赏
  • 举报
回复
up

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧