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

如何依不同 OS 編譯程式 ?

答題得分者是:RaynorPao
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-06 17:20:45 IP:210.202.xxx.xxx 未訂閱
我寫了一個程式希望可以在 WIN98 及 WIN NT 系列執行, 但是因為我有使用到一部份 WIN NT API(如: GetDefaultPrinterA...), 希望可以在編譯或是執行時依不同OS執行不同程式(目前我的程式在 WIN 98 會出現找不到輸出函式), 請問各位有何建議解決此問題 ? 謝謝各位 !!!
------
將問題盡快結案也是一種禮貌!
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-06 17:29:20 IP:147.8.xxx.xxx 未訂閱
Compile time: set some compiler directives (e.g. $WINNT) and use {$ifdef WINNT} {$else} {$endif} Runtime: Look for GetVersion and GetVersonEx API.
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-06 20:54:03 IP:163.15.xxx.xxx 未訂閱
danny你好: 我依照123.exe來說明 在2000環境中可以直接找123.exe的''名子'' 可是在98中就必須加入123.exe的路徑
------
======================
昏睡~
不昏睡~
不由昏睡~
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-07 11:49:51 IP:163.31.xxx.xxx 未訂閱
引言: 我寫了一個程式希望可以在 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-09 10:34:09 IP:210.202.xxx.xxx 未訂閱
謝謝 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-12-09 10:40:34 IP:203.73.xxx.xxx 未訂閱
引言: 謝謝 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-12-09 12:17:30 IP:61.221.xxx.xxx 未訂閱
引言: 我寫了一個程式希望可以在 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-12-09 17:03:14 IP:210.202.xxx.xxx 未訂閱
謝謝 RaynorPao 兄提供的意見, 目前看來這應該是比較接近我的需求了, 如果有研究到更好的方式我再 Post 上來. 謝謝各位給我的指教 !!!
------
將問題盡快結案也是一種禮貌!
系統時間:2024-07-07 3:49:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!