2016年4月19日 星期二

Registry

http://biosengineer.blogspot.tw/2007/12/vc-windows-registry.html


1.型態

Registry 的 Value的型態
REG_SZ                  就是  LPCSTR 
REG_MULTI_SZ     就是  
REG_DWORD        就是  DWORD   
REG_BINARY 


2.主鍵 (HKEY)
 就是 HKEY_LOCAL_MACHINE / HKEY_CURRENT_USER .... 

3. 





註冊表的存取方式由微軟文件上說明得知,需要做3種步驟:

1. 得到Handle

       RegOpenKeyEx 或是 RegCreateKey

2. 存取你要的鍵值

    RegSetValueEx() 或是 RegQueryValueEx()


3.關閉Handle

     RegCloseKey()

2016年3月30日 星期三

Call by Reference

https://dotblogs.com.tw/brian/2012/10/18/77588

Call by Reference 和 Call by Address的效果相同 ,  只是寫法不同.


int main() {
    int x = 5;
    foo(x); // 不用加& }
void foo(int &x) {
    x++; // 修改此x就是修改main的x }
csie-tw.blogspot.com

如果寫成call by pointer的方式,麻煩的地方是每次傳address都要加個 & ,而在副程式裡還要加個 * 來指向原本的實體。因此,C++新增了Call by reference的方式,讓在丟變數到副程式時,不用加&,而在副程式參做此變數也不用加*號就可以直接修改其變數。唯一要寫的是:在副程式裡的參數裡加上&,代表是Call by reference。


另外一種寫法

int a = 10, b = 20;
int &x = a;
特別要注意的是,Call by reference的方式,一定要在初始化時就有指向的實體,而且不能改變。

Read more: http://tw.tonytuan.org/2010/03/call-by-valuecall-by-pointercall-

2016年3月18日 星期五

【整理】Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR

L表示long指針,這是為了兼容Windows 3.1等16位操作系統遺留下來的,在win32中以及其他的32為操作系統中, long指針和near指針及far修飾符都是為了兼容的作用,沒有實際意義。即win32中,long,near,far指針與普通指針沒有區別,LP 與P是等效的。
P表示這是一個指針。
T表示_T宏,這個宏用來表示你的字符是否使用UNICODE, 如果你的程序定義了UNICODE或者其他相關的宏,那麼這個字符或者字符串將被作為UNICODE字符串,否則就是標準的ANSI字符串。
STR表示這個變量是一個字符串。
C表示是一個常量,const。
LPTSTR: 如果定義了UNICODE宏則LPTSTR被定義為LPWSTR。typedef LPTSTR LPWSTR;
否則LPTSTR被定義為LPSTR。typedef LPTSTR LPSTR;

下面列出一些常用的typedefs:
類型MBCS Unicode
WCHAR wchar_t wchar_t
LPSTR char* char*
LPCSTR const char* const char*
LPWSTR wchar_t* wchar_t*
LPCWSTR const wchar_t* const wchar_t*
TCHAR char wchar_t
LPTSTR TCHAR*(或char*) TCHAR* (或wchar_t*)
LPCTSTR const TCHAR* const TCHAR*
由於Win32 API文檔的函數列表使用函數的常用名字(例如, SetWindowText"),所有的字符串都是用TCHAR來定義的。(除了XP中引入的只適用於Unicode的API)。所以結論,在VS2005系統中,為提​​高可移植性,定義字符串時用TCHAR,轉化為UNICODE時用_T而不用L。



http://www.cnblogs.com/goed/archive/2011/11/11/2245702.html

2016年3月9日 星期三

Functor 仿函數

ref : http://shininglionking.blogspot.tw/2014/01/c-functor-function-like-object-part-ii.html

Functor

Functor 簡單來說就是具有 function 功能的 object (或是說把Struct或Class假裝成一個函式的樣子。)
(仿函數跟callback函數很類似)
因此 functor 讓我們可以像是呼叫 function 般的去使用?
這個技巧賦予我們在寫程式時更方便與安全的方法

ex:
 struct absValue  // absValue 是functor的名字
{
float operator()(float f) {  // functor的重點在於這個 operator()
return f > 0 ? f : -f;
}
};
or ...
struct compareS  // functor的重點在於這個 operator()
{
 int m_a;
bool operator()(int a , int b) {
m_a = a; //這邊可以紀錄資料
                 return (a<b);              
}
};

使用方法是

std::vector<int> v;
std:: sort( v.begin(), v.end(), compareS() )



所以可以說 , 是一個 overload operator的class object 或是 struct.
進一步說 , functor 有用的地方就在於他本身其實是個 object,所以他比 function 多了記錄資料的功能,這個能力促使我們更加靈活與方便的撰寫程式而不會受限於 function 的規格。善加利用這個技巧,我們就可以在 OO 的設計上有更多的選擇,





2016年2月22日 星期一

Linux 常用指令

netstat 指令

netstat -pltu  或者是 -pltu

-p 通訊協定 : 顯示指連線的通訊協定.預設的狀況這個通訊協定包含 tcp, udp, tcpv6, or udpv6. 如果配合 -s 參數則是可以顯示統計數量

-t TCP

-u UDP

-a 顯示所有的連線


ps 指令
ps -A
-a 顯示同一終端下的所有程式

-A 顯示所有進程
a  顯示所有進程
c  顯示進程的真實名稱

error while loading shared libraries

error while loading shared libraries

錯誤訊息example

./openwsmand: error while loading shared libraries: libwsman_server.so.1: cannot open shared object file: No such file or directory

這篇的重點在兩個 1. 指令 ldconfig  2. lib 說明文件 /etc/ld.so.conf 和 /etc/ld.so.cache

1)如果共享庫文件安裝到了/lib或/usr/lib目錄下,那麼需執行一下ldconfig命令 
ldconfig命令的用途,主要是在預設搜尋目錄(/lib和/usr/lib)以及 etc/ld.so.conf內所列的目錄下,搜索出可共享的dynamic library(格式如lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認為/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表.

2)如果共享庫文件安裝到了/usr/local/lib(很多opensource的shared library都會安裝到該目錄下)或其它"非/lib或/usr/lib"目錄下,那麼在執行ldconfig命令前,還要把新shared library目錄加入到共享庫配置文件/etc/ld.so.conf中,如下:
cat /etc/ld.so.conf 
include ld.so.conf.d/*.conf 
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig

3)如果shared library安裝到了其它"非/lib或/usr/lib"目錄下,但是又不想在/etc/ld.so.conf中加路徑(或者是沒有權限加路徑).那可以export一個Global變數 LD_LIBRARY_PATH ,然後運行程序的時候就會去這個目錄中找shared library.
LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到shared library. 可以設定多個搜索目錄, 這些目錄之間用冒號分隔開. 比如安装了一个mysql到/usr/local/mysql目錄下, 其中有一大堆shared library在/usr/local/mysql/lib下面, 則可以在.bashrc或.bash_profile或shell里加入以下:

export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH

一般來講這只是一種臨時的解決方案,在沒有權限或臨時需要的時候使用

4)如果程序需要的庫文件比系統目前存在的村文件版本低,可以做一個鏈接比如:
error while loading shared libraries: libncurses.so.4: cannot open shared object file: No such file or directory 
ls /usr/lib/libncu*
/usr/lib/libncurses.a   /usr/lib/libncurses.so.5
/usr/lib/libncurses.so  /usr/lib/libncurses.so.5.3

可见虽然没有libncurses.so.4,但有libncurses.so.5,是可以向下兼容的
建一个链接就好了
ln -s  /usr/lib/libncurses.so.5.3  /usr/lib/libncurses.so.4

ref: http://blog.chinaunix.net/uid-26212859-id-3256667.html