精華區beta C_and_CPP 關於我們 聯絡資訊
在 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