全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:994
推到 Plurk!
推到 Facebook!

取得作業系統服務列表的問題

答題得分者是:Zard
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-29 11:07:53 IP:60.191.xxx.xxx 未訂閱
小弟參照http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21216中的例程時,發現執行老是出錯,於是自己一條條的寫,發現執行至< >行時出錯:“ >< >< >< >< >< >< >< >此句出錯< >< >< >< >< >< >< >< > >< >< >< >< >< >< >< >此句出錯< >< >< >< >< >< >< >
------
-=-=-=-=-=-=-=-=-=-=-=
Eveything as your wish.
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-29 12:41:06 IP:210.243.xxx.xxx 未訂閱
因為你的buffer(lpService)太小了, 在我的電腦試所需要的buffer大小為7058bytes(從dwBytes:=sizeof(TEnumServiceStatus)+dwBytesNeeded; 得知), 但lpService: Array[0..100] of TEnumServiceStatus; 才3636bytes, 所以只要加大buffer就可以了, 幫你修改了一下, 紅色部份. 或者你可以用動態陣列在得知所需大小時才分配記憶體, 或是乾脆一次分配大一點的buffer, 這樣就不用怕這種情形再發生了.
procedure TForm1.Button1Click(Sender: TObject);
var
  bRet: boolean;
  i,dwBytes,dwBytesNeeded,dwServicesReturned,dwResumedHandle: DWORD;
  lpService: Array[0..300] of TEnumServiceStatus;    begin
  ListBox1.Items.Clear;
  hSCManager:=OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
  if varisnull(hSCManager) then
  begin
    showmessage('Can''t open Service Control Manager Database');
    exit;
  end;
  dwBytesNeeded:=0;
  dwServicesReturned:=0;
  dwResumedHandle:=0;
  bRet:=EnumServicesStatus( hSCManager,
                            SERVICE_WIN32,
                            SERVICE_STATE_ALL,
                            ServiceStatus,
                            sizeof(TEnumServiceStatus),
                            dwBytesNeeded,
                            dwServicesReturned,
                            dwResumedHandle);
  if (bRet = false) and (ERROR_MORE_DATA=GetLastError()) then
  begin
    dwBytes:=sizeof(TEnumServiceStatus) dwBytesNeeded;        EnumServicesStatus( hSCManager,
                        SERVICE_WIN32,
                        SERVICE_STATE_ALL,
                        lpService[0],
                        dwBytes,
                        dwBytesNeeded,
                        dwServicesReturned,
                        dwResumedHandle);
    for i := 0 to dwServicesReturned-1 do
    begin
      ListBox1.Items.Add(lpservice[i].lpServiceName   ': '   lpservice[i].lpDisplayName);
    end;
  end;
end;
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-29 13:45:20 IP:60.191.xxx.xxx 未訂閱
太感謝Zard了,問題解決了,謝謝!
------
-=-=-=-=-=-=-=-=-=-=-=
Eveything as your wish.
系統時間:2024-05-15 3:47:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!