본문 바로가기

C++20

ConvertBSTRToString 함수 메모리 누수 문제 BSTR 값을 Char*로 변경을 하기 위해서 ConvertBSTRToString 함수를 사용했는데 메모리 누수가 발생이 되었다. ConvertBSTRToString 함수를 사용해서 리턴되는 Char*을 삭제를 해야 한다. VARIANT vtProp; //----------------------------------------------------------------------- VariantInit(&vtProp); hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); if (hr == S_OK) { char* pszChar = _com_util::ConvertBSTRToString(vtProp.bstrVal); _temp = CString(pszChar); delete[.. 2023. 9. 14.
safearray 값을 SafeArrayAccessData 이용해서 읽어 오는 방법 MSDN을 찾아 봤지만 debug 상태에서는 값을 확인했는데 어떻게 해서 값을 읽어 올 수 있는지 예제를 찾아 보다가 발견했다. 아래 링크를 들어가 보면 원본을 확인 할 수 있다. 내가 이것을 찾게 된 이유는 CodeProject의 질문과 같이 IP주소를 읽어 오기 위해서였다. 덕분에 좋은 정보를 얻었고 혹시 사라질까봐 내 블로그에 남겨둔다. https://www.codeproject.com/Questions/884234/How-Do-I-Get-Ip-Address-From-Win-Networkadaptercon [Solved] How Do I Get Ip Address From Win32_Networkadapterconfiguration (Ps: How Do I Get Rate Of Flow) - Cod.. 2023. 9. 7.
ProcessID로 Handle 찾기 및 WM_COPYDATA 처리 문제 IPC를 할 때 다양한 방법이 있지만 WM_COPYDATA를 사용한 윈도우Q에 SendMessage를 보내는 방식이 있다. 간단하고 쉬워서 많이 사용을 한다. WM_COPYDATA를 이용해서 C#, MFC 등 다른 개발 언어로 통신을 하는 경우도 많다. 이번에 C# MFC 프로그램간에 SendMessage를 보내는데 잘 안되는 문제가 발생했다. C#에서 RunExecute로 MFC 프로그램을 실행하고 C# 앱의 ProcessID를 전달받아 MFC에서는 ProcessID로 핸들을 찾고 다시 SendMessage를 보내는 방식이다. MFC에서 아래와 같은 방식으로 핸들을 구했다. //Get Device Manage HWND HWND m_hwndDeviceMan = NULL; HWND m_tHwnd = NUL.. 2021. 4. 12.
std::map에서 char array를 key로 사용하기 아래와 같이 char array를 map의 키로 사용을 해보려고 테스트를 해봤다. std::map 2021. 4. 8.
memcmp 바이트 Array 비교를 할 때 사용 C, C++ 표준 함수 중에 memcmp 함수가 존재하다. #include // C++ 에서는 int memcmp(const void* ptr1, const void* ptr2, size_t num); ptr1 이 가리키는 처음 num 바이트의 데이터와 ptr2 가 가리키는 처음 num 바이트의 데이터를 비교하여 이들이 같다면 0 을 리턴하고 다르다면 0 이 아닌 값을 리턴. 이 함수를 사용하는 바이트 Array가 같은지 확인을 할 수 있다. for 문을 돌면서 바이트 하나씩 비교하는 함수를 만들 필요가 없다. 2021. 3. 31.
pointer new, delete, 지역 pointer 변수 오류 Pointer의 이름이 길거나 구조체 안에 있는 포인터일 경우 지역 포인터 변수를 만들어 임시 처리를 하는 경우가 있다. 이 때 오류를 범할수 있다. 예을 들어 A구조체에 char* b가 존재할 경우 우리는 사용을 할 때 A->b로 접근을 해서 사용을 한다. 이 이름이 길면 함수 안에서 임시 포인터를 만들어서 사용을 한다. char* temp = A->b; 위와 같이 하면 b의 포인터 주소가 temp와 같고 우리는 temp를 A->b를 대신해서 사용을 한다. 만약 A->b를 delete 하고 다시 new를 해야 하는 상황일 경우 어떤 일이 발생할까? char* temp = A->b; if (temp) delete temp; temp = NULL; 위와 같이 처리를 하면 A->b는 NULL이 될까? tem.. 2017. 3. 28.
std::string Split http://stackoverflow.com/questions/5167625/splitting-a-c-stdstring-using-tokens-e-g?answertab=votes#tab-top std::string을 split 하는 방법을 찾다가 이 방법이 가장 좋은 것 같아 글을 남긴다. 추후에도 많이 사용할 것 같다. #include #include #include using namespace std; int main() { vector strings; istringstream f("denmark;sweden;india;us"); string s; while (getline(f, s, ';')) { cout 2016. 4. 26.
Visual Studio "he optimize pragma" 처리 The optimize pragma라는 것이 있군요. 이것을 이용하면 특정 함수 부분에 optimize을 사용하지 않도록 가능합니다. 현재 수정 및 테스트 중~ 잘 해결되었으면 좋겠네요. https://msdn.microsoft.com/en-us/library/chh3fb0k.aspx 2015. 12. 22.
IME 선택된 언어 확인하기 정말 고생해서 찾았다. 구글링을 해서 찾지 못했는데 역시 MSDN 예제에서 힌트를 얻었다. Message중에 "WM_INPUTLANGCHANGE"가 있다. 그런데 App에서 Message Hooking을 해봤는데 IME 변경을 할 때 들어가지 않는다. 윈도우에서 현재 화면에 있는 활성화 된 윈도우에 메시지를 보내지 않는 걸까? 결국 글 입력할 때마다 IME를 확인하도록 만들었다. // Define language ID #define LID_TRADITIONAL_CHINESE 0x0404 #define LID_JAPANESE 0x0411 #define LID_KOREAN 0x0412 #define LID_SIMPLIFIED_CHINESE 0x0804 한글은 조합을 해서 화면에 표시가 되기 때문에 "WM_I.. 2014. 9. 5.
LIST