顯示具有 VC 標籤的文章。 顯示所有文章
顯示具有 VC 標籤的文章。 顯示所有文章

2017年10月26日 星期四

CRT程式庫與靜態程式庫

最近為了寫一個與IE有關的程式用VC來開發
但是呢,為了將64與32的程式放在一起所以要使用靜態程式庫的方式
因為這兩個要用的DLL同名所以要分開放

找了半天都看不是很懂網路上介紹的方式
後來找到微軟的網頁
才把這個功能搞定, 紀錄一下以免以後忘了
一般來說要使用靜態程式庫要在專案的屬性頁找到執行階段程式庫這個設定


使用/MT 或 /MTd 就可以讓大部份的程式變成不需要額外的DLL就可以執行
因為VC有將大部分的LIB包含進來

但是如果要使用的程式庫不是預設的就要自己加
我要用的是 vcruntime 這個程式庫所以就要查剛剛那個網頁
找到連結器的其他相依性來設定需要用到的 LIB 檔案
如此就可以編譯過了

例外要注意的是除錯版本微軟都有標示不可轉散發
所以為了避免有相關的問題還是使用Release的版本

2014年9月25日 星期四

取得作業系統版本資訊

利用WINDOWS API 取得相關資訊
可以參考 GetVersionEx() function

得到的結構參考 OSVERSIONINFOEX

這次是為了取得是否是 Win7 以上的版本
相關的Code如下


bool  IsWindows7OrGreater()
{
    OSVERSIONINFO info;
    GetVersionEx(&info);

    return info.dwMajorVersion>=6;
}



2014年4月14日 星期一

Services程式與一般程式之間共享資訊

主要是透過Share Memory的方式建立可以共同存取的記憶體
這樣A可以寫入資訊讓B去讀取, 彼此溝通

Process A:

HANDLE hFile;
char writeBuffer[128]={0};
LPCTSTR pBuf;          
char szFileName[]="Global\\Test";
SECURITY_ATTRIBUTES security;
ZeroMemory(&security, sizeof(security));
security.nLength = sizeof(security);
ConvertStringSecurityDescriptorToSecurityDescriptor(
         "D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)",
         SDDL_REVISION_1, &security.lpSecurityDescriptor,NULL);

hFile = CreateFileMapping((HANDLE)0xFFFFFFFF,&security,PAGE_READWRITE,0,sizeof(writeBuffer),szFileName  );

pBuf = (LPCTSTR)MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,sizeof(writeBuffer));
strcat((char*)pBuf,"This is a Share Memory!!");
CloseHandle(hFile);


Process B:

char szFileName[]="Global\\Test";
Char writeBuffer[128]={0};
LPCTSTR pBuf;
HANDLE hFile;
hFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szFileName);
pBuf=(LPCTSTR)MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,sizeof(writeBuffer));
if(strlen(pBuf))
    Edit1->Text = pBuf;
CloseHandle(hFile);



特別要注意的是紅色部分是 Service 要加入的部分, 透過這樣設定DACL授予普通用戶讀取權限的記憶體共享, 如果需要寫入的話, 要將 GR改成GWGR, 只是, 請注意, 這樣是不安全的!!

參考網頁:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx
http://stackoverflow.com/questions/898683/how-to-share-memory-between-services-and-user-processes
http://msdn.microsoft.com/en-us/library/windows/desktop/aa376401(v=vs.85).aspx

2013年9月30日 星期一

HEAP CORRUPTION DETECTED

最近在Visual Studio 2010 上開發了一個工具,
在 detete 一塊記憶體的時候跳出了一個錯誤訊息

找了幾天沒發現原因, 後來靠google大神才知道
這個錯誤在debug mode的時候才會出現,
release mode不一定會出現
原因是debug mode在malloc時會多alloc一些memory
以便檢查是否有寫過頭的情況發生

其實在錯誤訊息舊有提到 "CRT detected that the application wrote to memory after end of heap buffer"

後來去trace 後發現, vc在 alloc 的這段memory前後都放了一些檢查碼來check是否有寫過頭的現象發生, 如果在debug mode有出現這些訊息而release mode沒有出現的時候
就不要不放在心上, 不然哪天程式冒出不知明原因的錯誤就不好找了

ps: CRT 指的應該就是 C RunTime lib