在线等待!如果让程序自己删除自己? 我想让用户自动下载新版程序如何从服务器上下载新程序更新自己本机程序(本程序就一个可执行文件)如能解答本人将不胜感激! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //删除自己procedure DeleteSelf;var pExitProcess: Pointer; pDeleteFile: Pointer; pUnmapViewOfFile: Pointer; hModule: THANDLE; cBuf: array[0..MAX_PATH] of Char;begin hModule := GetModuleHandle('kernel32'); if hModule <> 0 then begin pExitProcess := GetProcAddress(hModule, 'ExitProcess'); pDeleteFile := GetProcAddress(hModule, 'DeleteFileA'); pUnmapViewOfFile := GetProcAddress(hModule, 'UnmapViewOfFile'); end else begin pExitProcess := nil; pDeleteFile := nil; pUnmapViewOfFile := nil; end; hModule := GetModuleHandle(nil); GetModuleFileName(hModule, cBuf, Sizeof(cBuf)); CloseHandle(THANDLE(4)); asm XOR EAX, EAX; PUSH EAX; PUSH EAX; LEA EAX, cBuf; PUSH EAX; MOV EAX, pExitProcess; PUSH EAX; MOV EAX, hModule; PUSH EAX; MOV EAX, pDeleteFile; PUSH EAX; MOV EAX, pUnmapViewOfFile; PUSH EAX; RET; end;end;end. 谢谢楼上的我还想问一下logonUser()怎么用啊我想登陆到服务器上拷贝文件到本机,如何在程序中实现登陆服务器(不需要用户输入服务器密码) 已知: User Name、Password、Domain,如何验证该User为该Domain的合法User? 使用LogonUser看能不能成功。(仅能在nt下使用不能在win9x上使用)目前好象只能使用LogonUser,如果你熟悉LSA API的话或许LSA好用一些,但太复杂了。进程调用LogonUser需要有SE_TCB_NAME特权,在特定情况下也需要SE_CHANGE_NOTIFY_NAME特权。获得特权可以参考下面的示例:if( !OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_PRIVILEGES,&hProcessToken ) )// Error Process;if( !LookupPrivilegeValueA( NULL, lpPrivilegeName, &(tp.Privileges[0].Luid) ) )// Error Process;tp.PrivilegeCount = 1;tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;if( !AdjustTokenPrivileges(hProcessToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES) + sizeof( LUID_AND_ATTRIBUTES ) * 2,NULL,NULL ) )// Error Process; CloseHandle( hProcessToken );:热水 时间:00-12-11 18:26:27 ID:415513补充:Procedure Login(sUserID:WideString;sAPassWord):Boolean;varsAID:String;LL:Handle;beginsAID:=sUerID;//重点Pchar不支持WideStringsDomainName:=....//读取注册表Flag:=LogonUser(pchar(sAID),pchar(sDomainName),pchar(sAPassWord),LOGON32_LOGON_NETWORK,LOGON32_PROVIDER_DEFAULT,LL);If not Flag thenbeginResult:=FalseelseResult:=True; 非常感谢 madyak(无天)对于LogonUser的授权我还是不清楚为什么我使用logonuser总是False能不能留下QQ号?想和你讨论这方面的问题 我也没用过logonuser只是给你一些资料! 楼上的删除自己比较麻烦转载一下:ly_liuyang(Liu Yang) 的方法这个绝对没有问题我用得好好的,98/2000/XP都OKprocedure DeleteSelf;var BatchFile: TextFile; BatchFileName: string; ProcessInfo: TProcessInformation; StartUpInfo: TStartupInfo;begin BatchFileName := ChangeFileExt(Paramstr(0),'.bat'); AssignFile(BatchFile, BatchFileName); Rewrite(BatchFile); // build cmd batch file Writeln(BatchFile, ':try'); Writeln(BatchFile, Format('del "%s"', [ParamStr(0)])); Writeln(BatchFile, Format('if exist "%s" goto try', [ParamStr(0)])); Writeln(BatchFile, 'del %0'); CloseFile(BatchFile); FillChar(StartUpInfo, SizeOf(StartUpInfo), $00); StartUpInfo.dwFlags := STARTF_USESHOWWINDOW; StartUpInfo.wShowWindow := SW_HIDE; // create hidden process if CreateProcess(nil, PChar(BatchFileName), nil, nil,False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,ProcessInfo) then begin CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); end;end;这个原理是生成一个临时的bat文件 对,用批处理比较简单。不过楼上的方法也有点麻烦。直接用Tstringlist建立批处理不是更简单? Delphi很简单的问题 dbgrid能不能增加一个虚拟列,用来标识这行是否选中? !!简单问题,请热心朋友回答!! 我是初学者,我有一个关于DCOM的很菜的问题。(在线等待) 请问摄像头编程问题 请问谁有用Delphi开发的邮件发送与接收程序.能够发送如163,sina,sohu邮件? 谁用过DEVEXPRESS的dxdblookupedit,属性中lookupkeyvalue怎么用的? 哪里有DELPHI6的安装程序制作工具 有较简单的方法能给各类控件都加多一个属性吗? 粗线问题.快来拿分啦!!!! ADO问题 DBGrid如何显示多列?
procedure DeleteSelf;
var
pExitProcess: Pointer;
pDeleteFile: Pointer;
pUnmapViewOfFile: Pointer;
hModule: THANDLE;
cBuf: array[0..MAX_PATH] of Char;
begin
hModule := GetModuleHandle('kernel32');
if hModule <> 0 then
begin
pExitProcess := GetProcAddress(hModule, 'ExitProcess');
pDeleteFile := GetProcAddress(hModule, 'DeleteFileA');
pUnmapViewOfFile := GetProcAddress(hModule, 'UnmapViewOfFile');
end else
begin
pExitProcess := nil;
pDeleteFile := nil;
pUnmapViewOfFile := nil;
end;
hModule := GetModuleHandle(nil);
GetModuleFileName(hModule, cBuf, Sizeof(cBuf));
CloseHandle(THANDLE(4));
asm
XOR EAX, EAX;
PUSH EAX;
PUSH EAX;
LEA EAX, cBuf;
PUSH EAX;
MOV EAX, pExitProcess;
PUSH EAX;
MOV EAX, hModule;
PUSH EAX;
MOV EAX, pDeleteFile;
PUSH EAX;
MOV EAX, pUnmapViewOfFile;
PUSH EAX;
RET;
end;
end;
end.
我还想问一下logonUser()怎么用啊
我想登陆到服务器上拷贝文件到本机,如何在程序中实现登陆服务器(不需要用户输入服务器密码)
使用LogonUser看能不能成功。(仅能在nt下使用不能在win9x上使用)目前好象只能使用LogonUser,如果你熟悉LSA API的话或许LSA好用一些,但太复杂了。进程调用LogonUser需要有SE_TCB_NAME特权,在特定情况下也需要SE_CHANGE_NOTIFY_NAME特权。获得特权可以参考下面的示例:if( !OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_PRIVILEGES,&hProcessToken ) )// Error Process;if( !LookupPrivilegeValueA( NULL, lpPrivilegeName, &(tp.Privileges[0].Luid) ) )// Error Process;tp.PrivilegeCount = 1;tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;if( !AdjustTokenPrivileges(hProcessToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES) + sizeof( LUID_AND_ATTRIBUTES ) * 2,NULL,NULL ) )// Error Process; CloseHandle( hProcessToken );:热水 时间:00-12-11 18:26:27 ID:415513补充:Procedure Login(sUserID:WideString;sAPassWord):Boolean;varsAID:String;LL:Handle;beginsAID:=sUerID;//重点Pchar不支持WideStringsDomainName:=....//读取注册表Flag:=LogonUser(pchar(sAID),pchar(sDomainName),pchar(sAPassWord),LOGON32_LOGON_NETWORK,LOGON32_PROVIDER_DEFAULT,LL);If not Flag thenbeginResult:=FalseelseResult:=True;
对于LogonUser的授权我还是不清楚
为什么我使用logonuser总是False
能不能留下QQ号?想和你讨论这方面的问题
我用得好好的,98/2000/XP都OK
procedure DeleteSelf;
var
BatchFile: TextFile;
BatchFileName: string;
ProcessInfo: TProcessInformation;
StartUpInfo: TStartupInfo;
begin
BatchFileName := ChangeFileExt(Paramstr(0),'.bat');
AssignFile(BatchFile, BatchFileName);
Rewrite(BatchFile);
// build cmd batch file
Writeln(BatchFile, ':try');
Writeln(BatchFile, Format('del "%s"', [ParamStr(0)]));
Writeln(BatchFile, Format('if exist "%s" goto try', [ParamStr(0)]));
Writeln(BatchFile, 'del %0');
CloseFile(BatchFile);
FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
StartUpInfo.wShowWindow := SW_HIDE;
// create hidden process
if CreateProcess(nil, PChar(BatchFileName), nil, nil,False, IDLE_PRIORITY_CLASS,
nil, nil, StartUpInfo,ProcessInfo) then
begin
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
end;这个原理是生成一个临时的bat文件
直接用Tstringlist建立批处理不是更简单?