社区
C++ Builder
帖子详情
怎样让我的程序在强行关掉时出现“无法完成操作,串绑定无效”
钛哥
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());
}
//---------------------------------------------------------------------------
烟波三千里人鬼五百年
2002-07-20
打赏
举报
回复
:)
kingcaiyao
2002-07-20
打赏
举报
回复
To cker:
如果用户在程序中模拟这个退出按钮的单击,那么bNormal标志一样会设置成TURE,表明是正常退出。
烟波三千里人鬼五百年
2002-07-20
打赏
举报
回复
那他要是向这个按钮发消息模拟按下来推出呢?....:)
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
java windows 计
时
工具
java虚拟机配置 在默认情况下,
程序
启动
时
会使用自身的jre(以下所说的jar为java虚拟机1.6.0以上版本,低版本则
无法
启动
程序
)。 在主目录(安装目录、
程序
所在的目录)的“jre1.6”目录下,如果没有则需要在主目录...
易语言
程序
免安装版下载
4) 修改静态编译后“读配置项”命令在第三个参数“配置项名称”为空文本
时
导致
程序
崩溃的BUG 5) 修改高级选择夹中的组件在窗口载入后强制得到焦点的BUG 6) 修改MYSQL支持库跨静态编译的EXE和DLL传递连接句柄和...
多媒体教室
此模式下,屏幕广播的内容为1:1显示,窗口显示的内容能根据屏幕广播或录制
时
教师的鼠标移动情况而做相应滚动,这样就不会
出现
在自由滚动模式下有
时
会看不到教师的
操作
以及在缩放显示模式下看不清楚屏幕广播具体...
socket error即Windows套接字错误代码
应用
程序
尝试使用事件对象,但指
定
的句柄
无效
。请注意,此错误由
操作
系统返回,因此Windows的将来的版本中的错误号可能会更改。 WSA_NOT_ENOUGH_MEMORY 8 内存不足。 应用
程序
使用直接映射到Windows功能的...
Kafka consumer.shutdown 关闭
无效
,后台线程一直在消费
Kafka停不掉shutdown关闭不了问题 原因是卡在了consumer.close()方法里面,它会提交offset信息,如果网络中断或者kafka服务器有问题导致提交不了offset,则consumer.close方法会一直卡住(不停的循环尝试提交...
C++ Builder
13,826
社区成员
102,678
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章