2014年9月29日 星期一

QueryDosDevice( ) 取得MS-DOS 的硬體設備訊息

QueryDosDevice() 原型如下:

DWORD WINAPI QueryDosDevice(
  __in_opt  LPCTSTR lpDeviceName,
  __out     LPTSTR lpTargetPath,
  __in      DWORD ucchMax
);

該函數可以取得MS-DOS 下的設備訊息,

1、 lpDeviceName 是輸入參數,是MS-DOS的硬體代號。

2、 lpTargetPath 是輸出參數,用來存儲返回值。

3、 ucchMax 為第2個參數的buff 大小。

// QueryDosDevice.cpp : 定義程式進入點// #include "stdafx.h" #define    BUFSIZE    256 typedef TCHAR    *PTCHAR; int _tmain(int argc, _TCHAR* argv[]){    setlocale (LC_ALL, "chs");     TCHAR    szDevice[256] = {0};        // 存储磁盘根路径     TCHAR    szDrive[3] = {0};            // 存储单个磁盘根路径     TCHAR    szName[MAX_PATH];            // 存储 MS-DOS 设备信息     PTCHAR    p = szDevice;     GetLogicalDriveStrings(BUFSIZE, szDevice);     _tprintf (TEXT("获取的 MS-DOS 设备名为:\n"));    do {        CopyMemory (szDrive, p, 2*sizeof(TCHAR));        // 将驱动器根路径拷贝到缓冲区,要去掉反斜杠         if ( !QueryDosDevice(szDrive, szName, BUFSIZE) ) {            _tprintf (TEXT("QueryDosDevice 获取失败 : %d\n"), GetLastError());            return (-1);        }        UINT uNameLen = _tcslen(szName);    // 设备名长度         if (uNameLen < MAX_PATH) {             _tprintf (TEXT("%s  %s\n"), szDrive, szName);        }        while (*p++);        // 空循环,到下一个 NULL (C:\NULLD:\NULLE:\)    } while (*p);            // 还有其它盘符     return 0;}

2014年1月23日 星期四

c++ Vector 整理

使用vector前,請先  #include <vector>。以下文章若無特別說明,則均假設如下:
vector<int> v, v1, v2;
int array[] = {0,1,2,3,4};

0. vector 快速使用
vector<int> v1;
vector<double> v2;
// 清除內容, 重新設大小
v1.clear(), v2.clear();
v1.resize(5); 
v2.resize(10);
// 新增元素
int i;
for(i=0; i<v1.size(); i++) v1.push_back(i);
for(i=0; i<v2.size(); i++) v2[i] = double(i);

1. 大小控制
(1.1) 檢查是否為空:v.empty();
(1.2) 直接將v清空:v.clear();
(1.3) 檢查目前大小:v.size();
(1.4) 檢查最大容量:v.maxsize();
(1.5) 檢查目前容量:v.captacity();
(1.6) 清除所有內容:v.clear(); 
(1.7) 清除指定元素:v.erase(v.begin());  v.erase(v.end()-1);
(1.8) 讀取並刪除最後一元素:v.pop_back(v.size()-1);
(1.9) 重新設定大小:v.resize(5);
關於 v.resize() 要說明一下,若開始是使用 vector<int> v(3,5),將v設成3個元素,每個元素都設5,之後調用 v.resize(2) 之後,邊界大小被調成2 ,若再調用 v.resize(6),則 v[0], v[1] 為 5,v[2]~v[5] 為 0。
(1.10) 自動掌控大小:v.reserve(6)
和 v.resize() 有所不同,v.resize() 是將 vector 重新調整大小。若開始是用 vector<int> v(3, 5),使用 v.reserve(6),實際上 vector v 之大小仍為3,同時調用 v.at(3) 仍將失敗。詳情請查閱 MSDN。

2. 建構子(Construction)
#define CNT 5
int array[] = {0,1,2,3,4};
int *arr2 = new int[CNT];
for(int i=0; i<CNT; i++) arr2[i] = i;

(2.1) 建立空之 vector:vector <int> f1; // 建立空之 vector
(2.2) 建立4個元素為100之v:vector <int> f2(4, 100);
(2.3) 用iterator直接從f2複製元素:vector <int> f3(f2.begin(), f2.end());
(2.4) 從 array(stack) 複制:vector <int> f4(array, array + sizeof(array)/sizeof(int)); 
(2.5) 從 array(heap) 複製:vector <int> f5(arr2, arr2+CNT);
注意,若 vector 初始化為 empty,在建立任何元素之前,不可調用足標運算子。如:
 vector<int> v;
 v[0] = 1;
 v[1] = 2;
 

3. 尋訪(travel)
 (3.1) ,(3.2) 假設如下:

int i;
int array[] = {0,1,2,3,4};
vector<int> v(array, array+sizeof(array)/sizeof(array[0]);
(3.1) 使用足標運算子 / function member - at
// 尋訪, 0,1,2,3,4
for(int i=0; i<v.size(); i++) cout << v[i] << " ";
for(int i=0; i<v.size(); i++) cout << v.at(i) << " ";
(3.2) 使用 iterator
vector<int>::iterator it_i;
// 尋訪
for(it_i=ff.begin(); it_i!=ff.end(); ++it_i) cout << *it_i << " "; 

4. 將其它 vector 或 array 設給 (assign) 另一 vector
int array[] = {0,1,2,3,4};
vector<int> v(10,0); // {0,0,0,0,0,0,0,0,0,0}
vector<int> v1;
v1.assign(10, 0); // v1 設 10 個 0
v1.assign(v.begin(), v.end()); // v1 複制 v
v1.assign(v.begin(), v.begin()+5); // 複製 v 前5個元素到 v1
v1.assign(array, array+5); // 複製 array 前5個元素到 v1

5. 新增/移除元素
(5.1) 從尾端新增:for(i=0; i<10; i++) v.push_back(i);
(5.2) 從尾端移除:while(!v.empty()) v.pop_back();

6. 當二維陣列使用
unsigned i,j;
vector<vecotr<int> > x; // x[M][N]
x.resize(M);
for(i=0; i!=M; ++i) x[i].resize(N);
for(i=0; i!=M; ++i)
    for(j=0; j!=N; ++j)
        x[i][j] = i*N+j;

2014年1月16日 星期四

C/C++筆記-substr取得部份字串

substr 是取索引位址第5個字元開始之後的8個字元

substring 是取索引位址第5個字元開始到第8個字元

2014年1月8日 星期三

VisualBox 使用USB開機方法

在CMD 下,輸入 cd c:\Program Files\Oracle\VirtualBox

在輸入,VBoxManage internalcommands createrawvmdk -filename C:\XPE.vmdk -rawdisk \\.\PhysicalDrive2

最後面的PhysicalDrive 為裝置代號。

前面為vmdk儲存的位置。

2013年10月28日 星期一

TStream, TFileStream

TStream 是一个抽象的基类, 不能直接生成对象

TStream --> THandleStream --> TFileStream
TStream --> TCustomMemoryStream --> TMemoryStream
TStream --> TCustomMemoryStream --> TResourceStream
TFileStream: 文件流
TStringStream: 字符串流
TMemoryStream: 内存流
TResourceStream: 资源文件流
TStream 有 Seek() 方法, 它的子类们(
TFileStream、TMemoryStream、TBytesStream、TStringStream、
TResourceStream、TStreamAdapter、THandleStream...)
也都有 Seek() 方法, 且用法一样.

另外它们也都有 Position 属性, 使用 Position 属性完全可以代替 Seek() 方法,
通过 Position 还可以方便地 "读取" 当前位置; 但如果只是移动位置, 使用 Seek() 方法更方便.

方法的参数:
Seek(偏移量, 偏移的起始点), 返回值是偏移后的当前位置.
偏移量: 以字节为单位, 负值表示向前偏移;
起始点:
0 表示从头算起、
1 表示从当前位置算起、
2 表示从尾部算起; 从尾部算起时, 偏移量应该是个负值.

指示起始点时, 可以使用 soFromBeginning、soFromCurrent、soFromEnd 三个常数,
但最好使用枚举 TSeekOrigin = (soBeginning, soCurrent, soEnd);

Seek() 方法有两个重载, 就是可以使用常数、也可以使用枚举来标识偏移的起始点.

TFileStream 打开模式与共享模式:

分类参数说明



fmCreate 建立文件, 如果存在则打开它。
fmOpenRead只读打开
fmOpenWrite只写打开
fmOpenReadWrite读写打开



fmShareCompat共享模式, 兼容 Dos
fmShareExclusive 不允许别人以任何方式打开
fmShareDenyWrite 允许别人以只写方式打开
fmShareDenyRead允许别人以只读方式打开
fmShareDenyNone允许别人以任何方式打开

2013年10月24日 星期四

SendMessage() 跟 PostMessage()

message 傳遞可分為SendMessage() 與 PostMessage() 
SendMessage() 跟 PostMessage()宣告如下
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
LRESULT PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
hWnd為目標 HWND
Msg 為我們要傳送的message 如 WM_PAINT
wParam 跟 lParam 為 message 的參數


兩者宣告一樣 差別在於

  • SendMessage() 將message送出去之後 便會停住 
  • 等待該message處理完之後 才會return


  • PostMessage() 則是送出去之後 便馬上return 
  • 使用PostMessage() 會有速度比較快的優點


SendMessage() 的使用時機為我們將message傳出去後,
需要跟另一端處理做同步 或者是需要接收傳回來的參數 這時當然要使用SendMessage()。

比方說 window系統中有個message叫做 WM_GETTEXT,(此message功效等同GetWindowText() )
我們可以向一個HWND發出這個message 之後,他便會將text 放在lParam所指定的位置傳回來。
當SendMessage() 目標為自己同一個thread的HWND時,
系統會很聰明的自動去呼叫目標HWND的WNDPROC來處理,
這樣便不會造成堵塞(請參考message loop)。


PostMessage() 的用法就只是單純通知對方而已,
送出去之後 就不管他了 為一種簡單方便的使用方法。

2013年10月7日 星期一

利用指標,更改原始結構值

struct point *pp
宣告pp為一個指標,指向一個point結構
(*pp).x, (*pp).y 取值 或寫為 pp->x, pp->y

typedef int Length Length定義成與int同義的字
typedef char *String String定義成指向文字的指標