.NET

GDI+, 파일 I/O 에서 80004005 에러 발생

김모작자 2017. 2. 20. 13:37

C# 에서 GDI+ 사용하여 생성한 이미지를 저장하려니 


System.Runtime.InteropServices.ExternalException (0x80004005): GDI+에서 일반 오류가 발생했습니다.

   위치: System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)

   위치: [xxxxxxx].[xxxx](Entry entry)


위와 같이 80004005 에러가 생기기도 하고, 


메인 쓰레드에 잘 쓰던 기능을 내가 만든 다른 타 쓰레드에서 호출, File 접근, 기록 할 때 마다 Access Denied (= Win32 에 5번 코드)  가 발생했다면 ...


ACL 권한 때문에 분명 Impersonate 시켜서 시작했는데....

분명 메인 쓰레드(=시작 쓰레드)에서는 별 문제 없던 코드였는데

자식 스레드에서 위 에러가 발생한다면

해당 쓰레드가 Impersonate 되지 않았기 때문이다..


그 문제가 되는 쓰레드 생성할 때 원래 쓰레드의 정보를 넘겨주면 해결된다는 거..

즉, Impersonation 은 쓰레드간 (자동으로) 공유되지 않는다는 점.


아래 func 함수에서 쓰레드 생성하는것처럼 Impersonation 정보를 주고 받고 해야함..

자식 쓰레드)

void ThreadProc(object obj){


var identity = (WindowsIdentity) obj;


using(var impersonation = identity.Impersonate()){


// 원래 코드


}

}


부모 쓰레드)


void func(){


Thread thread = new Thread(new ParameterizedThreadProc(WindowsIdentity.GetCurrent() ));


// .....

}


예제라서 WindowsIdentity 이고,, 상황에 따라 적절한 Identity 를 사용하면 될듯...