我在dpr中是这样写的:implementation
{$R *.DFM}
function RegisterServiceProcess (dwProcessID, dwType: DWord) : DWord; stdcall; external 'KERNEL32.DLL';procedure Tclient.FormCreate(Sender: TObject);
begin
  Application.Initialize;
  if GetSystemVer_Lqb='Windows 9x' then  //自定义函数,判断操作系统类型
    RegisterServiceProcess(GetCurrentProcessID,1); //隐藏进程
  Application.Run;
end;  在 98 中运行没问题;
  但是在 2000 中运行时总是有这样的错误:
  无法定位程序输入点refisterserviceprocess于动态链接库kernel32.dll上.请问这是怎么回事呢?
  为什么加了操作系统类型判断还会有这样的错误信息啊?

解决方案 »

  1.   

    因为你是用了静态连接,只要应用程序一加载就会在kernel32.dll找RegisterServiceProcess这个输出过程。
      

  2.   

    最簡単方法:把'KERNEL32.DLL'放入Application的相同路径里
      

  3.   

    2000的系统文件夹(C:\WINNT\system32)中有KERNEL32.DLL这个文件的啊.
      

  4.   

    这个函数, 只在 win9X 中有!!!win2k开始是不支持的, 也找不到的!!!
      

  5.   

    简单点修改, 可如下:{$IFDEF _WIN32}
       function RegisterServiceProcess (dwProcessID, dwType: DWord) : DWord; stdcall; external 'KERNEL32.DLL';
    {$ENDIF}
    ...
    procedure Tclient.FormCreate(Sender: TObject);
    begin
      Application.Initialize;
      {$IFDEF _WIN32}
        RegisterServiceProcess(GetCurrentProcessID,1); //隐藏进程
      {$ENDIF}
      Application.Run;
    end;
      

  6.   

    w2k似乎不支持这个函数,9x中可以用来隐藏进程,w2k中就没这么容易了.
    好像只有先判断windows版本,如果是win9x,可以动态加载.
      

  7.   

    用下面的代码改成动态装载var
     RegisterServiceProcess = function(dwProcessID, dwType: DWord) : DWord; stdcall; procedure Tclient.FormCreate(Sender: TObject);
    var
      Handle:word;
    begin
      Application.Initialize;
      if GetSystemVer_Lqb='Windows 9x' then  //自定义函数,判断操作系统类型
      begin
        Handle:=LoadLibrary('Kernel32.dll');
        if Handle>32 then
        begin
          @RegisterServiceProcess:=GetProcAddress(Handle,"RegisterServiceProcess");
          RegisterServiceProcess(GetCurrentProcessID,1); //隐藏进程
          FreeLibrary(Handle);
        end;
      end;
      Application.Run;
    end;
      

  8.   

    偶看过了,2000 server+SP4 或者2003的kernel32.dll都没有导出RegisterServiceProcess这个函数;所以换条路试试。
    我个人觉得这个函数的风格就是9x的,不适合NT;---前天晚上我debug了半个钟头,最后发现GetThreadId函数只存在于win2003里,sigh啊!
      

  9.   

    觉得你应该将此Dll置于与你应用程序同上目录下,以前我也碰到此情况,不过不是系统的Dll罢了
      

  10.   

    有没有谁研究一下 aiirii(ari-爱的眼睛) 的方法啊?好象不管用哦.
      

  11.   

    我在我的電腦試過啊, 可用啊!!
     
    >>有没有谁研究一下 aiirii(ari-爱的眼睛) 的方法啊?好象不管用哦.
    什麼意思???
      

  12.   

    那只是编译的时候管用啊,编译出来的EXE文件不能同时适应98和2000系统哦。
      

  13.   

    问题已经解决。
    manfeng() 的方法可行,不过他的代码好象有一处错误。下面代码DELPHI 5.0 中编译通过:unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      end;
    var
      Form1: TForm1;
      RegisterServiceProcess : function(dwProcessID, dwType: DWord) : DWord; stdcall;
    implementation
    uses Unit_Share_Lqb;
    {$R *.DFM}
    procedure Tform1.FormCreate(Sender: TObject);
    var
      Handle:THandle;
    begin
      if GetSystemVer_Lqb='Windows 9x' then  //自定义函数,判断操作系统类型
      begin
        Handle:=LoadLibrary('KERNEL32.DLL');
        if Handle>32 then
        begin
          @RegisterServiceProcess:=GetProcAddress(Handle,'RegisterServiceProcess');
          RegisterServiceProcess(GetCurrentProcessID,1); //隐藏进程
          FreeLibrary(Handle);
        end;
      end;
    end;
    end.
      

  14.   

    >>那只是编译的时候管用啊,编译出来的EXE文件不能同时适应98和2000系统哦。
    我的方法, 应该与
    >>manfeng() 的方法可行一样, 只是简单一些吧??
      

  15.   

    至少我在DELPHI5里试了不行啊,98、2000下我都试了,真的不行哦。