在 Win32 裡頭, 將一些通訊時會用到的資訊用 COMMPROP 這個結構來表示. (當然不
僅僅是 Serial Port) 可以用 GetCommProperties() 來取得:
BOOL GetCommProperties(
HANDLE hFile, // handle of communications device
LPCOMMPROP lpCommProp // address of communications properties structure
);
typedef struct _COMMPROP { // cmmp
WORD wPacketLength; // packet size, in bytes
WORD wPacketVersion; // packet version
DWORD dwServiceMask; // services implemented
DWORD dwReserved1; // reserved
DWORD dwMaxTxQueue; // max Tx bufsize, in bytes
DWORD dwMaxRxQueue; // max Rx bufsize, in bytes
DWORD dwMaxBaud; // max baud rate, in bps
DWORD dwProvSubType; // specific provider type
DWORD dwProvCapabilities; // capabilities supported
DWORD dwSettableParams; // changable parameters
DWORD dwSettableBaud; // allowable baud rates
WORD wSettableData; // allowable byte sizes
WORD wSettableStopParity; // stop bits/parity allowed
DWORD dwCurrentTxQueue; // Tx buffer size, in bytes
DWORD dwCurrentRxQueue; // Rx buffer size, in bytes
DWORD dwProvSpec1; // provider-specific data
DWORD dwProvSpec2; // provider-specific data
WCHAR wcProvChar[1]; // provider-specific data
} COMMPROP;
在這裡, lpCommProp 需要 programmer 自行配置空間. 有趣的問題是, 系統在這個結
構之後會需要額外的空間. 但是配置者也就是 programmer 卻不知道系統會需要多少.
很簡單的做法是配置一大塊絕對會夠的空間. 另一個聰明的做法是執行兩次
GetCommProperties() , 第一次只配置 sizeof(COMMPROP) 這麼大的空間, 因為還沒
有開始執行一些動作, 所以系統並不會嘗試著在後面填東西, 所以不會出問題. 接著
執行第一次的 GetCommProperties(), 得到結果, 取出結構中的 wPacketLength, 這
個 member 代表實際上需要的大小, 然後依據這個大小重新配置一個新的. 這樣的話
, 就不會有浪費任何空間的問題了.
這樣了解了嗎? oel 桑 :-)
--
※ Origin: 程式設計樂園 ◆ From: alpha1.cs.nthu.edu.tw
> -------------------------------------------------------------------------- <
作者: gaudy (布拉姆斯的愛與恨) 看板: C_and_CPP
標題: Re: 好奇怪的 結構喔....
時間: Mon Apr 19 16:54:56 1999
※ 引述《qing.bbs@cszone.cc.ntu.edu.tw (東京紅色情人夢-中島廣香)》之銘言:
: ※ 引述《leolarrel (我是可愛的C++)》之銘言:
: : 不然要改成怎麼樣呢?? 各位..幫幫我
: typedef struct _SHITEMID2 { // mkid
: ꀠꀠUSHORT cb; // size of identifier, including cb itself
: ꀠꀠBYTE abID[20]; // variable length item identifier
: } SHITEMID2, * LPSHITEMID2; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
: 宣告成這樣, 然後 cast 進去你要傳入的函式中.
: 呃, 我只知道這樣做, 也許是個笨方法也說不一定..
是正確的方法...
在 Win32 Programming 中, 常常有這種東西, 例如調色盤:
typedef struct tagLOGPALETTE { // lgpl
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[1];
} LOGPALETTE;
因為圖形檔(或螢幕模式)不一定有幾種顏色, programmer 要
自己決定, 或者 run-time 偵測 etc.
--
※ 發信站: 批踢踢實業坊(ptt.twbbs.org)
◆ From: ippc161.act.nct