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

CDROM Programming For Win (2)

 
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-08 08:37:03 IP:61.216.xxx.xxx 未訂閱
////////////////////////////////////////////// ////歡迎轉載,但請保留版權內容 ////版權所有:Turboted ////連絡方式:turboted@ms1.url.com.tw ////發表日期:2002/12/8 ////////////////////////////////////////////// 本專文接下來的重點將會放在如何使用 ASPI 撰寫CDROM程式 首先,需要先把WNASPI32.DLL這一個ASPI的DLL檔含入到程式內 在含入之前,必需先加入兩個ASPI本身提供的H檔 分別為WNASPI32.H和SCSIDEF.H 這兩個檔的作用都是在宣告一些 基本的Struct 和內定的參數值 內容大概就是這樣的東西 //********************************************************************* // %%% SRB - ABORT AN SRB - SC_ABORT_SRB (3) %%% //********************************************************************* typedef struct // Offset { // HX/DEC BYTE SRB_Cmd; // 00/000 ASPI command code = SC_ABORT_SRB BYTE SRB_Status; // 01/001 ASPI command status byte BYTE SRB_HaId; // 02/002 ASPI host adapter number BYTE SRB_Flags; // 03/003 Reserved DWORD SRB_Hdr_Rsvd; // 04/004 Reserved VOID FAR *SRB_ToAbort; // 08/008 Pointer to SRB to abort } SRB_Abort, *PSRB_Abort, FAR *LPSRB_Abort; #define SS_NO_ADAPTERS 0xE8 // No host adapters to manage #define SS_INSUFFICIENT_RESOURCES 0xE9 // Couldn't allocate resources needed to init #define SS_ASPI_IS_SHUTDOWN 0xEA // Call came to ASPI after PROCESS_DETACH #define SS_BAD_INSTALL 0xEB // The DLL or other components are installed wrong 這個部份算是已經相當的完整,對於程式開發會相當的便利 以下是一段load wnaspi32.dll的Example 之前我已經說過,舊版本的ASPI在2000/XP底下是無法正常使用的 所以load wnaspi32.dll時,還需要加強一段判斷os的code 才能確保自己程式在別人的電腦會發生不可預期的錯誤 void __fastcall TForm1::Load_WNASPI32_DLL() { OSVERSIONINFO osv; osv.dwOSVersionInfoSize = sizeof(osv); GetVersionEx(&osv); //if = 5 os is 2000 xp //else this os is win98 me if(osv.dwMajorVersion == 5) { SetCurrentDir("C:\\Program Files\\Ahead\\Nero\\"); if (FileExists("wnaspi32.dll")) hinstwnaspi32 = LoadLibrary ("C:\\Program Files\\Ahead\\Nero\\wnaspi32.dll"); else hinstwnaspi32 = LoadLibrary ("wnaspi32.dll"); } else hinstwnaspi32 = LoadLibrary ("c:/windows/system/wnaspi32.dll"); if (hinstwnaspi32==NULL) { ShowMessage("Wnaspi32.dll Loading Error \n WIN9X C:\\WINDOWS\\SYSTEM\\WNASPI32.DLL \n WINNT_XP C:\\WINDOWS\\SYSTEM32\\WNASPI32.DLL"); Application->Terminate(); } 在這段code裏使用了OSVERSIONINFO和GetVersionEx 來做OS的判斷,其實還有其他OS判斷的API,但是為了求全部WIN OS 都能正常執行,就選了這個搭配的方法(是由四人幫研究後的成果) OSVERSIONINFO請參考 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/osversioninfo_str.asp GetVersionEx請參考 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getversionex.asp 寫WIN的程式..MSDN是相當寶貴而且必備的工具 在把dll檔正式的load之後,需要做的,是function的宣告 可以直接參考ASPI32.PDF裏面已經有完整的飯粒,我就不再多做解釋 第二篇就在此結束,下一篇將會為您實際研究如何得到CDROM的Vendor Name 發表人 - turboted 於 2002/12/08 14:32:55
bio
一般會員


發表:42
回覆:36
積分:20
註冊:2003-03-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-27 10:06:15 IP:211.74.xxx.xxx 未訂閱
turboted先進您好 是這樣的: 我已有VC可用的WNASPI32.lib的檔案 可是當我在BCB將wnaspi.lib 從 project->add to project 然後選擇Library file(*.lib) 於是呼complier後出現這樣的錯誤訊息 我聽說好像有的wnaspi32.lib檔有的人專門為VC寫的,所以在BCB上為必就可直接套用,不曉得是啥原因??? 可否請turboted解惑呢 謝謝
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-31 01:40:23 IP:61.217.xxx.xxx 未訂閱
引言: 我聽說好像有的wnaspi32.lib檔有的人專門為VC寫的,所以在BCB上為必就可直接套用,不曉得是啥原因???
不是專為 VC 寫的意思.. 早在 DOS/Win16 的年代, 大家都用 OMF format object file OMF我忘了哪些廠商制定的, 不過其中一家是 Intel. 直到 Win32 上, M$ 轉而改用 Coff format 的東西, 而 Borland 仍然固守 OMF format. 這就是不相容的原因. 使用 implib 就可以從 DLL 的 .idata section 中抓出該 DLL export 的functions, 進而製作 OMF lib files. Borland 固守 OMF 的理由我不清楚就是了. (知道內情的出來說說? XD) --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子
bio
一般會員


發表:42
回覆:36
積分:20
註冊:2003-03-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-08 00:45:50 IP:203.67.xxx.xxx 未訂閱
miyu您好 這個問題我後來參照一位前輩忘了 不過我有記著網址 但放在公司 明兒個上班時我會再補上來 我把nero的wnaspi32.dll挖來 然後配合wnaspi32.h檔 就可製作出符合BCB可用的wnaspi32.lib檔了 雖不知其中奧義 但可幫忙解決吾之問題 不過還是謝謝你的解說 敝人也在學習階段 請大家指教
bio
一般會員


發表:42
回覆:36
積分:20
註冊:2003-03-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-08 12:04:06 IP:211.74.xxx.xxx 未訂閱
在RayNorPao文章中有詳細說明 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33420
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-08 13:26:14 IP:211.75.xxx.xxx 未訂閱
引言: 在RayNorPao文章中有詳細說明 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33420
那篇文章的用意是把 VC 的 static lib, 利用 VC 重包成為 DLL, 以供給 BCB 使用. 載入法是用動態的方法載入. (LoadLibrary(), GetProcAddress() ... ) 如果是現成的 DLL, 並作靜態連結, 你也可以用 implib -a -c dllname.lib dllname.dll 去產生一個 OMF 格式的 Lib file 給 BCB 用. --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子
Snoopy
一般會員


發表:1
回覆:2
積分:0
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-19 15:45:44 IP:61.62.xxx.xxx 未訂閱
我有寫好的WinASPI相容程式 共有有兩種, 函式完全與WinASPI 相同 1: 使用 spti 方式, (只適用於2K/XP以上版本) 2: 使DDK storage LowerFilters方式 可用於 Win9X/ME/2K/XP以上版本 可以免費提供給非營利之用
Snoopy
一般會員


發表:1
回覆:2
積分:0
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-19 15:51:47 IP:61.62.xxx.xxx 未訂閱
hWinAspi32 = ::LoadLibrary( AspiDllName.c_str()); GetASPI32SupportInfo = (DWORD (*)(void))::GetProcAddress( hWinAspi32, "GetASPI32SupportInfo"); SendASPI32Command = (DWORD (*)(LPSRB))::GetProcAddress( hWinAspi32, "SendASPI32Command"); GetASPI32DLLVersion = (DWORD (*)(void))::GetProcAddress( hWinAspi32, "GetASPI32DLLVersion"); TranslateASPI32Address = (bool (*)(PDWORD, PDWORD))::GetProcAddress( hWinAspi32, "TranslateASPI32Address"); ::FreeLibrary( hWinAspi32);
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-19 16:05:37 IP:61.30.xxx.xxx 未訂閱
目前我在玩DEVICEIOCONTROL,過一陣子我會把整個CDDOCTOR的ASPI拿掉 Snoopy兄,感謝您的分享,雖然用不到,但也希望有需要的人可以多多學習 當一條路上只有一人行時,總是異常的寂寞
nicolas
一般會員


發表:39
回覆:40
積分:15
註冊:2004-05-05

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-02 10:19:29 IP:61.219.xxx.xxx 未訂閱
如果用在嵌入式系統可行嗎?
系統時間:2024-07-01 21:14:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!