IActiveDesktop에 대하여...
IActiveDesktop 이라는 COM 객체에 대해 몇 가지 질문이 있습니다.
1. 이 객체로 바탕 화면의 표시 형식 (가운데, 늘이기, 바둑판식 배열)을 바꾸려면 어떤 메서드를 써야 하나요?
2. GetWallpaper 메서드가 현재 바탕 화면으로 지정된 그림 파일의 경로를 가져오는걸로 알고 있는데
이게 가져오는 방식이 경로 문자열 반환이 아니라 매개 변수를 통해서 문자열을 복사하는 거라서
C#에서 어떻게 이걸 이용해야 할 지 모르겠습니다.
HRESULT GetWallpaper(OUT LPWSTR pwszWallpaper, IN UINT cchWallpaper, IN DWORD dwFlags);
이런 꼴인데 이걸 C#에서 표현할려면
1번안.
interface IActiveDesktop
{
int GetWallpaper([Out][MarshalAs(UnmanagedType.LPWStr)] string pwszWallpaper, int cchWallpaper, int dwFlags);
}
이렇게 인터페이스를 만들고
IActiveDesktop activeDesktop = Activator.CreateInstance(...(중간 생략)
string str = null;
activeDesktop.GetWallpaper(str, 256, 0);
이렇게 사용해 보니까 str이 계속 null이군요...
그래서 아래와 같이 고친 다음에 사용하니까
2번안.
interface IActiveDesktop
{
int GetWallpaper([Out] IntPtr pwszWallpaper, int cchWallpaper, int dwFlags);
}
IActiveDesktop activeDesktop = Activator.CreateInstance(...(중간 생략)
string str = null;
IntPtr p = Marshal.AllocHGlobal(256);
activeDesktop.GetWallpaper(p, 256, 0);
str = Marshal.PtrToStringAuto(p);
이렇게 해 봤더니 이번엔 str이 경로명이 아니라 그냥 쓰레기 문자들이 뜨는군요..
과연 이 메서드를 어떻게 이용해야 하나요?
댓글 달기