Tôi có một lớp COM CMyCOMServer
triển khai IMyInterface
trong một ứng dụng, cả với GUID chính xác. CMyCOMServer::QueryInterface
sẽ trả về S_OK (và tự chuyển sang đúng loại) nếu IUnknown hoặc IMyInterface được yêu cầu, ngược lại nó trả về E_NOINTERFACE.CoCreateInstance trả lại E_NOINTERFACE mặc dù giao diện được tìm thấy
Trong một ứng dụng trên cùng một máy PC, tôi gọi:
HRESULT hr = ::CoCreateInstance(__uuidof(CMyCOMServer), 0, CLSCTX_SERVER,
__uuidof(IMyInterface),(void **)&pInterface);
Nó trả E_NOINTERFACE. Vì vậy, tôi cho rằng tôi đã làm điều gì sai và thêm điểm ngắt trên CMyCOMServer::QueryInterface
. Tôi thấy rằng khi CoCreateInstance
được gọi, QueryInterface
được kích hoạt nhiều lần cho các giao diện khác nhau:
- Thứ nhất, IUnknown được yêu cầu - không có vấn đề
- Sau đó, một số giao diện như IMarshall vv được yêu cầu ... những không được hỗ trợ vì vậy E_NOINTERFACE được trả về
- Cuối cùng, IMyInterface được yêu cầu. Tôi xác nhận QueryInterface trả S_OK và đặt
(IMyInterface *)this
như con trỏ giao diện, như mong đợi
Vì vậy, sự nhầm lẫn của tôi là lý do tại sao CoCreateInstance gọi là để lại cho tôi một con trỏ NULL và gửi lại mã của E_NOINTERFACE, khi ứng dụng máy chủ COM đang trở lại rõ giao diện tôi yêu cầu?
EDIT: ứng dụng khách của tôi gọi CoInitialize (NULL) khi khởi động, điều này không có sự khác biệt.
Chỉ cần làm rõ: Máy chủ COM của bạn chạy trong một ứng dụng và ứng dụng khách trong ứng dụng khác? Bởi vì điều đó có nghĩa là họ sẽ ở trong các quá trình khác nhau, và điều đó có nghĩa là bạn _need_ marshalling, có thể tùy chỉnh. – MSalters
Có. Hai ứng dụng riêng biệt trên 1 PC. Tôi không bao giờ phải lúng túng xung quanh với Marshalling trước đó, đó là lý do tại sao tôi bối rối. Tôi hầu như không nghe nói về nó trước đây và tôi đã thực hiện một số tiền hợp lý của sự phát triển COM. –