CDROM Programming For Win (2) |
|
turboted
版主 ![]() ![]() ![]() ![]() ![]() 發表:95 回覆:754 積分:452 註冊:2002-07-23 發送簡訊給我 |
//////////////////////////////////////////////
////歡迎轉載,但請保留版權內容
////版權所有: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 發送簡訊給我 |
|
miyu
中階會員 ![]() ![]() ![]() 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: 我聽說好像有的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 發送簡訊給我 |
|
bio
一般會員 ![]() ![]() 發表:42 回覆:36 積分:20 註冊:2003-03-05 發送簡訊給我 |
|
miyu
中階會員 ![]() ![]() ![]() 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: 在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 發送簡訊給我 |
|
Snoopy
一般會員 ![]() ![]() 發表:1 回覆:2 積分:0 註冊:2002-03-13 發送簡訊給我 |
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 發送簡訊給我 |
|
nicolas
一般會員 ![]() ![]() 發表:39 回覆:40 積分:15 註冊:2004-05-05 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |