我想让用户自动下载新版程序
如何从服务器上下载新程序更新自己本机程序(本程序就一个可执行文件)
如能解答本人将不胜感激!

解决方案 »

  1.   

    //删除自己
    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.
      

  2.   

    谢谢楼上的
    我还想问一下logonUser()怎么用啊
    我想登陆到服务器上拷贝文件到本机,如何在程序中实现登陆服务器(不需要用户输入服务器密码)
      

  3.   

    已知: 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; 
     
      

  4.   

    非常感谢 madyak(无天)
    对于LogonUser的授权我还是不清楚
    为什么我使用logonuser总是False
    能不能留下QQ号?想和你讨论这方面的问题
      

  5.   

    我也没用过logonuser只是给你一些资料!
      

  6.   

    楼上的删除自己比较麻烦转载一下:ly_liuyang(Liu Yang) 的方法这个绝对没有问题
    我用得好好的,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文件
      

  7.   

    对,用批处理比较简单。不过楼上的方法也有点麻烦。
    直接用Tstringlist建立批处理不是更简单?