COM coding시 알아둘점

시간날때 아래는 읽어보도록 하고 https://docs.microsoft.com/en-us/windows/win32/learnwin32/com-coding-practices __uuidof 연산자 다음과 같은 에러의 의미는 unresolved external symbol "struct _GUID const IID_IDrawable" GUID 상수가 외부에서 선언되었고, 링커가 해당 상수의 정의를 찾을 수 없음을 의미. GUID 상수는 대개 정적라이브러리파일에서 노출되는데. __uuidof 연산자를 사용하면 해당 정적라이브러리파일을 링크하지 않아도 된다(물론 MS-VC++에서만) 이 연산자는 MS 언어 확장이기 때문이다. 이 연산자는 표현식에서 GUID 상수를 리턴해준다. 표현식은 인터페이스 형식 이름, 클래스 이름, 인터페이스 포인터일 수 있다. CoCreateInstance의 기본 패턴은 CoCreateInstance (개체의 클래스 식별자, ..., 검색할 인터페이스, [OUT] 인터페이스 포인터) IDirectPlay8Peer* g_pDP=NULL; CoCreateInstance ( CLSID_DirectPlay8, NULL, CLSCTX_INPROC_SERVER,                         IID_IDirectPlay8Peer, (LPVOID *)&g_pDP ); 이를 __uuidof 연산자를 이용하면 IDirectPlay8Peer* g_pDP=NULL; CoCreateInstance ( __uuidof(DirectPlay8Peer), NULL, CLSCTX_INPROC_SERVER,                          __uuidof(IDirectPla...

NSE 아이콘 오버레이 추가하는 방법

https://stackoverflow.com/questions/20975679/icon-overlay-handlers-for-namespace-extension NSE에서 아이템에 대해 아이콘 오버레이를 추가하는 유일한 방법은 IShellIconOveray 를 구현하는 것임. 해당 인터페이스의 GetOverlayIndex , GetOverlayIconIndex 는 SHELL image list에서 받은 아이콘을 리턴해야 한다. SHGetIconOverlayIndex API를 통해서 얻어올 수 있다. SHELL image list에 추가 오버레이 아이콘을 추가할 방법은 없다. 표준 오버레이 아이콘을 사용하고자 한다면 SHGetIconOverlayIndex 만을 사용하면 된다. 커스텀 오버레이 아이콘을 사용하고자 하면 단순 additional overlay shell extention 을 사용해야 한다. overlay shell extention 은 추가 오버레이 아이콘을 SHELL image list에 추가할 수 있다. IShellIconOveralyIdentifier . GetOverlayInfo 1) 에서 icon 과 인덱스를 리턴해야 한다. 해당 인터페이스의 IsMemberOf 2) 는 항상 S_FALSE 리턴한다. 네가 구현하는 NSE에서 해당 인터페이스의 GetOverlayIndex 3) 에서 네가 선호하는 아이콘과 인덱스로 SHGetIconOverlayIndex를 호출한다. 아래에서는 위에서 언급한 대로 IShellIconOverlayIdentifier를 구현했다. https://stackoverflow.com/questions/31884145/custom-icon-overlays-for-namespace-extension?noredirect=1&lq=1 GetOveralyInfo ()에서 icon 파일과 인덱스를 리턴한다. IsMemberOf ()에서 시스템의 다른 파일에 대한 오버레이를 표시하지 않기 위해 S_FA...

C# 기본적으로 알아야 할 사항

https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/inside-a-program/coding-conventions [개체 이니셜라이저 사용] // Object initializer. var instance3 = new ExampleClass { Name = "Desktop" , ID = 37414 , Location = "Redmond" , Age = 2.3 }; // Default constructor and assignment statements. var instance4 = new ExampleClass(); instance4.Name = "Desktop" ; instance4.ID = 37414 ; instance4.Location = "Redmond" ; instance4.Age = 2.3 ; [배열을 사용할때 참고] // Preferred syntax. Note that you cannot use var here instead of string[]. string [] vowels1 = { "a" , "e" , "i" , "o" , "u" }; // If you use explicit instantiation, you can use var. var vowels2 = new string [] { "a" , "e" , "i" , "o" , "u" }; // If you specify an array size, you must initialize the elements one at a time. var vowels3 = new string [ 5 ]; vowels3[ 0 ] = ...

How to align sectors for unbuffered writes

The following C++ example shows how to align sectors for unbuffered file writes. The Size variable is the size of the original data block you are interested in writing to the file. #include <windows.h> #define ROUND_UP_SIZE(Value,Pow2) ((SIZE_T) ((((ULONG)(Value)) + (Pow2) - 1) & (~(((LONG)(Pow2)) - 1)))) #define ROUND_UP_PTR(Ptr,Pow2)  ((void *) ((((ULONG_PTR)(Ptr)) + (Pow2) - 1) & (~(((LONG_PTR)(Pow2)) - 1)))) void main() { // Function code     DWORD BytesPerSector = 0; // obtained from the GetFreeDiskSpace function.     DWORD Size = 0; // buffer size of your data to write // ... obtain data here // sample data     BytesPerSector = 65536;     Size = 15536; //    // Ensure you have one more sector than Size would require.    SIZE_T SizeNeeded = BytesPerSector + ROUND_UP_SIZE(Size, BytesPerSector);      // Replace this statement with any allocation routine....

CreateFile() DesiredAccess vs SharedMode 관계

출처 → https://kuaaan.tistory.com/407?category=91638 DesiredAccess는 기존의 열린 SharedMode의 부분집합이어야 하고 SharedMode는 기존의 열린 DesiredMode의 전체집합이어야 한다. ➤ hFile1 = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ); hFile2 = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE );   성공 hFile1(GENERIC_READ)로 열렸기 때문에 hFile2의 SharedMode가 이를 만족 hFile2 = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_WRITE );   실패 hFile1(GENERIC_READ)인데 SharedMode로 FILE_SHARE_WRITE이므로 ➤ hFile1 = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE ,                          FILE_SHARE_READ); hFile2 = CreateFile(argv[1], GENERIC_READ,                          FILE_SHARE_WRITE );   실패 hFile2의 SharedMode가 hFile1의 DesiredAccess를 포함한 셋이어야 하는데 아니므로. ...

clear view mode in FolderView vs 폴더별 뷰모드 설정 지우기

HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell Bags, BagMRU를 지워주고, 탐색기를 재시작해 준다 (참조 :  https://www.thewindowsclub.com/reset-folder-view-in-windows ) NSE로 테스트 해보면 ViewMode가 설정한 대로 동작하지 않는데 그것은 위의 값들이 먼저 적용이 되기 때문이다. 확실하게 테스트하려면 위를 지워놓고 하면 설정 ViewMode에 따라 동작하는 것을 볼 수 있다. 참고로 위 레지스트리에 보면 Shell\Bags\1\shell\{GUID}값들이 나오는데 여기에 올수 있는 값들로는 다음과 같다. Folder Type GUID Generic Library {5f4eab9a-6833-4f61-899d-31cf46979d49} Users Libraries {C4D98F09-6124-4fe0-9942-826416082DA9} Documents Folder {7D49D726-3C21-4F05-99AA-FDC2C9474656} Pictures Folder {B3690E58-E961-423B-B687-386EBFD83239} Videos Folder {5fa96407-7e77-483c-ac93-691d05850de8} Games Folder {b689b0d0-76d3-4cbb-87f7-585d0e0ce070} Music Folder {94d6ddcc-4a68-4175-a374-bd584a510b78} Contacts {DE2B70EC-9BF7-4A93-BD3D-243F7881D492} (참조 :  https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd798386(v=vs.85).aspx )

네트워크 드라이브 마운트하기

기본적으로 WNetAddConnection2 를 사용하면 됨 인증관련 창이 뜰때 내 윈도우 핸들을 넘기고 싶으면 WNetAddConnection3 를 사용 주의점으로 WNet API를 호출하는 어플리케이션은 user logon에 대해서만 적용을 받기 때문에, 전역적으로 영향을 주려면 아래와 같이 해야 한다. If a service that runs as LocalSystem calls the WNetAddConnect2 fuction, then the mapped drive is visible to all user logon sessions. 예제) NETRESOURCE nr; memset(&nr, 0, sizeof(NETRESOURCE); nr.dwType = RESOURCETYPE_ANY; nr.lpRemoteName = m_csRemote; nr.lpProvider = NULL; dwRetVal = WNetAddConnection2(&nr, m_csUserName, m_csPassword, dwFlags); if( dwRetVal == NO_ERROR )   success else   fail username 입력, password 미입력시 67리턴(ERROR_BAD_NET_NAME) asd