利用WINDOWS API 取得相關資訊
可以參考 GetVersionEx() function
得到的結構參考 OSVERSIONINFOEX
這次是為了取得是否是 Win7 以上的版本
相關的Code如下
bool IsWindows7OrGreater()
{
OSVERSIONINFO info;
GetVersionEx(&info);
return info.dwMajorVersion>=6;
}
2014年9月25日 星期四
2014年9月23日 星期二
Android 4.2.2 開啟 開發人員選項 的方法
- 首先先到 [設定] -> [關於手機] -> [版本號碼] 的地方
- 在 [版本號碼] 的地方連點7-10下
- 在 [設定] -> [系統] 的地方就會出現 [開發人員選項]
2014年9月18日 星期四
InstallShield 2012 Sprint 使用筆記
Custom Actions:
- 新增Kill Process的時候, 並沒有地方設定要kill的process name,這時候就要到 Behavior and Logic -> Property Manager 去新增一筆 ISTerminateProcesses, Value 設為要kill 的程式名, 多筆的時候用分號隔開, exp: a.exe;b.exe 參考網址
- 如果要在移除的時候執行指定的動作我目前的 Sequence 設定是將 Install Exec Sequence 設成 After SetARPINSTALLLOCATION, Condition 設為 REMOVE="ALL"
2014年5月22日 星期四
2014年4月14日 星期一
Services程式與一般程式之間共享資訊
主要是透過Share Memory的方式建立可以共同存取的記憶體
這樣A可以寫入資訊讓B去讀取, 彼此溝通
Process A:
Process B:
特別要注意的是紅色部分是 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
這樣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
2014年2月17日 星期一
BCB6 Warring W8058 Cannot create pre-compiled header: write failed
出現這個問題的時候是因為
Option-》Compiler-》Pre-compiled Headers 下面的FileName 設定路徑不存在
Option-》Compiler-》Pre-compiled Headers 下面的FileName 設定路徑不存在
2013年12月1日 星期日
BCB 編譯的時候出現 Unresolved external ThrowIfOutOfRange Error
最近在編譯一個就的程式的時候出現了一個 Linker Error
Unresolved external '__stdcall System::AnsiString::ThrowIfOutOfRange(int) const'
仔細的去查了程式碼發現問題發生的原因是在程式中使用了
AnsiString 的 operator[]
在網路上找了幾天之後發現這個問題從BCB5就存在
解決的方法是
1. 在option -> Advanced Compiler -> Calling convention 改用 C
或是
2. 直接修改dstring.h
我的檔案是位在$(BCB)\Include\Vcl\dstring.h (208行)
將void ThrowIfOutOfRange(int idx) const;改成
void __cdecl ThrowIfOutOfRange(int idx) const;
Unresolved external '__stdcall System::AnsiString::ThrowIfOutOfRange(int) const'
仔細的去查了程式碼發現問題發生的原因是在程式中使用了
AnsiString 的 operator[]
在網路上找了幾天之後發現這個問題從BCB5就存在
解決的方法是
1. 在option -> Advanced Compiler -> Calling convention 改用 C
或是
2. 直接修改dstring.h
我的檔案是位在$(BCB)\Include\Vcl\dstring.h (208行)
將void ThrowIfOutOfRange(int idx) const;改成
void __cdecl ThrowIfOutOfRange(int idx) const;
訂閱:
文章 (Atom)
