如何依不同 OS 編譯程式 ? |
答題得分者是:RaynorPao
|
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
引言: 我寫了一個程式希望可以在 WIN98 及 WIN NT 系列執行, 但是因為我有使用到一部份 WIN NT API(如: GetDefaultPrinterA...), 希望可以在編譯或是執行時依不同OS執行不同程式(目前我的程式在 WIN 98 會出現找不到輸出函式), 請問各位有何建議解決此問題 ? 謝謝各位 !!!danny: 試試這個BCB範例吧! http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21194 網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- |
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
謝謝 william, ko, axsoft 各位的指教,
axsoft 兄提的方法, 應該是沒辦法達到我的需求;
因為像 GetDefaultPrinterA 這類的 API 是 NT 才有的,
我只要 uses 宣告這類 API 的 Units, 在 WIN98 執行馬上會出現
"找不到輸出函式", 所以還沒有機會使用 GetVerson 或 GetVersonEx
來區分 OS 版本; 但是如果使用 william 兄的方式, 則我必需做二個版本
(For NT, WIN98), 各位可有其他的建議呢 ? 我記得 Delphi 有將一些 NT, WIN98 相同 API 的部份包裝成統一的 API,
所以我們使用時不用去管 OS 的版本, 我想可能可以解決這個問題;
不過到底是那些 API 有包裝成這樣 ? 可否指點我一下 ....
謝謝各位 !!!
------
將問題盡快結案也是一種禮貌! |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 謝謝 william, ko, axsoft 各位的指教, axsoft 兄提的方法, 應該是沒辦法達到我的需求; 因為像 GetDefaultPrinterA 這類的 API 是 NT 才有的, 我只要 uses 宣告這類 API 的 Units, 在 WIN98 執行馬上會出現 "找不到輸出函式", 所以還沒有機會使用 GetVerson 或 GetVersonEx 來區分 OS 版本; 但是如果使用 william 兄的方式, 則我必需做二個版本 (For NT, WIN98), 各位可有其他的建議呢 ? 我記得 Delphi 有將一些 NT, WIN98 相同 API 的部份包裝成統一的 API, 所以我們使用時不用去管 OS 的版本, 我想可能可以解決這個問題; 不過到底是那些 API 有包裝成這樣 ? 可否指點我一下 .... 謝謝各位 !!!danny 你好: 以下是我習慣的用法~~給你做參考 ( > ( > --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
引言: 我寫了一個程式希望可以在 WIN98 及 WIN NT 系列執行, 但是因為我有使用到一部份 WIN NT API(如: GetDefaultPrinterA...), 希望可以在編譯或是執行時依不同OS執行不同程式(目前我的程式在 WIN 98 會出現找不到輸出函式), 請問各位有何建議解決此問題 ? 謝謝各位 !!!procedure TForm1.FormCreate(Sender: TObject); var hToken : THandle; tkp : TTokenPrivileges; tkpo : TTokenPrivileges; zero : DWORD; MyVersionInfo: TOSVersionInfo; MyReg: TRegistry; ChkOsVer: integer; AppHandle:THandle; begin MyReg := TRegistry.Create; MyReg.RootKey := HKEY_LOCAL_MACHINE; MyVersionInfo.dwOSVersionInfoSize := sizeof(TOSVERSIONINFO); if GetVersionEx(MyVersionInfo) then ChkOsVer:=MyVersionInfo.dwPlatformId; if ChkOSVer = VER_PLATFORM_WIN32_NT then begin Zero := 0; if not OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then begin MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK ); Exit; end; if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then begin MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK ); Exit; end; // SE_SHUTDOWN_NAME if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then begin MessageBox( 0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK ); Exit; end; tkp.PrivilegeCount := 1; tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges( hToken, False, tkp, SizeOf(TTokenPrivileges ), tkpo, zero ); if Boolean( GetLastError() ) then begin MessageBox(0, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK ); Exit; end else ExitWindowsEx( EWX_FORCE or EWX_FORCE , 0 ); end // if OSVersion = 'Windows NT' else begin // just shut the machine down Winexec(Pchar('rundll32 shell32.dll,SHExitWindowsEx 9'),SW_Hide);//強制關機//98不能用EWX_POWEROFF 會變登出 end; close; 這是我用來關機的上述藍色部分是判定OS是否為2000
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |