MFC에서 COM를 사용하기 위해서는 스레드 로딩시에  CoInitialize()를 호출해 주어야 합니다.
저는 ADO를 통해서 Oracle에 접근하기 위해서 사용했습니다.
단순한 생각으로 처음부터 DB에 연결해서 주구장창 하나로 사용하려고 했습니다.
그래서 다중접속 부분의 동시접속 문제는 CriticalSection을 이용했는데
알고 보니 이게 좋은 방법이 아니었습니다.
그래서 각 유저가 접속할때마다 DB를 Open하고 쿼리 날리고 DB를 Close 할려고 했는데
CreateInstance를 생성할때마다 스마트포인터가 NULL로 되더군요..
알고 봤더니 COM을 MFC에서 사용하기 위해서는
CoInitialize를 호출하는데 이건 스레드당 한개씩 오픈해야 한다는 것 입니다.
제가 다중접속을 위해서 별도의 스레드로 소켓을 이용한 프로그래밍을 했는데
각각 별도의 스레드에서 DB를 접속할려고 하니 안되는 거였습니다. ㅡㅡ;
결국 스레드당 접속을 한 결과 접속을 잘 해결되었습니다.

ADO ? COM 사용시 주의사항??

1. CoInitialize()와 CoUninitialize()는 꼭 짝으로 이뤄서 사용하자 :
   C++이라면 클래스로 만들어서 생성자에서 CoInitialize()하고 소멸자에서 CoUninitialize()하면
   좋겠죠
2. ADO 사용을 편하게 하기 위해서 스마트 포인터를 사용하는데... 스마트 포인터는 내부적으로
   소멸자에서 Release()를 호출해 줍니다. 따라서 명시적으로 Release()를 호출하면은 안됩니다.

하나라도 정확하게 알고 사용하는거와
모르고 사용하는건 큰 차이가 있을을 다시 한번 느꼇습니다.
이거 배워야 할게 너무도 많네요... ^^

 
신고
posted by 뚱2