*레지스트리 : 기존의 ini파일을 옮겨놓은것
*레지스트리 함수
1)Create
HKEY hKey= ::RegCreateKeyEx(HKEY_CURRENT_USER,내키경로 , 0, NULL, REG_OPTION_NON_VOLITILE, KEY_ALL_ACCESS, NULL, &hKey, NULL); //오픈해줌
->이건 나중에 중복되면 Open해줌
hKey를 사용후에는 반드시 닫을것
2)write
::RegSetValueKey(key핸들, key값, NULL, REG_SZ, (BYTE*)문자열,문자열길이*sizeof(TCHAR)
3) Open
::RegOpenKeyEx(HANDLE hkey, LPCSTR subkey, DWORD option, REGSAM regsam, &hKey)
*UAC의 권한과정 알기
권한상승 매니페스트를 include하면 된다. ㅡㅡㅋ
*DLL (동적 링크 라이브러리)
DLL을 가상메모리랑 엮어서 생각해라.
*프로그램의 전체를 혼자만드는일은 별로없다. -> DLL을 만들거나 가져오는거잘해야한다.
*전직을 하려면 잘 알아봐야한다. 내가 할일. 내가 해온것 앞으로의 모든것을 다 고려해야한다.
3~4년차까지는 실력을 쌓을수 있는 위치로 갈것. 코드한줄이 내 실력이다 기본을 잊지말자.
* 머릿속으로 정리했다고 끝나는게 아니다. 끝까지 버텨보자. 머릿속으로 정리하고 혼자서 확인해보는것이 중요하다. 그리고 조금 천천히 하자. 성질급하게하지말고 천천히해보자. 시간이 다 해결해준다. 견뎌내야한다.
* MFC Appl wizard DLL에서 Reqular Type : API스타일.
확장스타일 : MFC랑 비슷하다.
만약 Win32 DLL이라면 완전 순수 API임
*DLL Main : DLL이 load/ unload될때 나온다. dwReason이 Attach면 load, detach면 unload.
*__declspec(dllexport)를 쓰고 그 밑에 원하는거 작성하면된다. API호출되게하려면 호출프로시저 명시해줘야한다 (ex. WINAPI). __declspec(dllexport)는 외부로 Export되어 사용하는것임을 명시. 이걸 나중에 DEF파일에서 export되는 속성임을 알려줄 필요가 없다.
* ::GetModuleFileName(NULL,szBuffer,MAX_PATH) : 파일의 절대경로를 돌려준다.
*Dll Output : *.dll(런타임에 필요), *.lib(링크타임필요), *.pdb(프로그램DB파일. UI개발자에게 같이 넘겨주어야한다. 그래야 함수 정보를 읽을 수 있다.). 아울러 DLL이 디버그면 실행도 DLL이어야된다.
그리고 헤더파일 포함하고, 그리고 디버그모드 릴리즈모드 두개를 써야한다.
그리고 주석을 제대로 달던가 도움말과 예제를 작성하던가 둘중하나는 꼭 쓸것!.
권장사항이다만 dll파일명도 디버그모드면 D라고 이름을 변경해주던가해라.
*DLL을 만들은 후에는 반드시, 프로젝트를 추가한다.
*DLL의 묵시적 로드의 문제 : 필요에따라 로드해야할 수 있고, 혹은 O/S버전에 따라 다르게 로드해야할수도 있다. 이경우는 문제가 된다.
-윈도우 버전알아내기 : GetVersionEx(struct);
만약 로딩해야할 방법이 다르다면 묵시적 로딩을 할 경우에는 해결이 안된다. (오류가 나기떄문에)
=> 명시적인 로딩으로 변경해야한다.
*명시적인 로딩
function(){
HMODULE hModule = ::LoadLibrary(_T("DllDemo.dll"));
if( hModule != NULL){
CString strTmp = _T("");
BOOL (WINAPI* pfnGetModulePath)(CString&) = NULL;
pfnGetModulePath = (BOOL (WINAPI*)(CString&))::GetProcAddress(hModule,_T("GetModulePath"));
if(pfnGetModulePath != NULL){
if(pfnGetModulePath(strTmp)){
AfxMessageBox(strTmp);
}
}
else{
AfxMessageBox(_T("ERROR:Failed to get function address!"));
}
::FreeLibrary(hModule);
}
else{
AfxMessageBox(_T("ERROR: Failed to Load Library"));
}
}
이대로하면 오류난다. name mangling때문에..
but, 함수 이름 앞에 extern "C"를 쓰면 name mangling을 하지 않는다.
더 좋은 방법은 GetModulePath @1이라고 dll.def파일의 EXPORT에 넣어준다. 그리고 __declspec(dllexport)을 쓰지않는다.
댓글