2009-10-22 22 views
7

Tôi muốn chặn các hàm COM CoCreateInstanceEx và/hoặc CoGetClassObject để thay thế một lớp bằng một thước đo thử nghiệm trong một bài kiểm tra đơn vị. Điều này sẽ chỉ cho một CLSID duy nhất; tất cả những người khác có thể đi qua không thay đổi. Có cách nào để thực hiện điều này mà không có những hacks ác, khủng khiếp?Có cách nào để móc hoặc chặn cuộc gọi CoGetClassObject và/hoặc CoCreateInstance không?

+1

Dupe: http://stackoverflow.com/questions/1505196/spying-on-com-objects –

+0

@Shay, thực sự là vậy. Tôi đã bỏ phiếu cho nó để được đóng lại như là một dupe, nhưng dường như nó không đủ mà chỉ là người hỏi bình chọn để đóng (tôi không muốn xóa, vì nó có thể giúp ai đó tìm kiếm trong tương lai) – bdonlan

+0

Không phải là bản sao . Câu hỏi đó là gián điệp trên các đối tượng COM. Câu hỏi này là để kiểm tra đơn vị. Những nỗ lực trước đây để giải quyết vấn đề bằng cách gắn kết CoCreateInstance - điều đó không có nghĩa là nó phải là câu trả lời. Câu hỏi này muốn móc CoCreateInstance. –

Trả lời

2

Tùy thuộc vào chính xác bạn muốn gì.

Nếu bạn muốn phát hiện ai đang tải lớp đó hoặc để tìm xem liệu nó có được tải hay không, bạn có thể sử dụng Process Monitor. Một cuộc gọi đến CoGetClassObject() (hoặc CoCreateInstanceEx()) sẽ dẫn đến một khóa HKCR\CLSID\{Class of interest id} đang được đọc và Process Monitor sẽ cho bạn biết quy trình nào và thời điểm thực hiện điều này và mức độ thành công của nó.

Nếu bạn muốn thay thế lớp hiện tại bằng lớp học - biên dịch thư viện với phiên bản lớp học có cùng id lớp và thay đổi đường dẫn đến máy chủ COM bên trong HKCR\CLSID\{Class of interest id} để thư viện của bạn được sử dụng để phân phát lớp học ID. Bạn có thể làm điều đó bằng tay hoặc bằng regsvr32 - trước tiên hãy đăng ký thư viện gốc, sau đó là thư viện của bạn để ghi đè lên lớp đăng ký sở thích. COM làm lớp id -> ánh xạ thư viện thông qua khóa đó khi người tiêu dùng gọi CoGetClassObject() hoặc CoCreateInstanceEx().

+0

Thật không may, tôi không thể lộn xộn xung quanh với đăng ký cho việc này - nó sẽ chạy trên một bộ kiểm tra tự động, và lớp tôi dự định ghi đè là 'CLSID_KnownFolderManager', do đó, có thể là một ý tưởng tồi để ghi đè điều đó trong một cách toàn hệ thống :) Trong trường hợp xấu nhất, tôi có thể thiết lập mã để kiểm tra, nhưng nếu có cách sạch sẽ để thay thế nó chỉ cho một quá trình, điều đó sẽ tốt đẹp. – bdonlan

+1

Trước tiên, bạn có thể đăng ký thư viện gốc sau khi bộ kiểm tra được chạy và điều này sẽ khôi phục lại sự tỉnh táo. Thứ hai, bạn có thể đăng ký thư viện đã sửa đổi của bạn cho người dùng hiện tại chỉ - sửa đổi HKCU \ Software \ Classes \ CLSID. Khác hơn là bạn không thể làm bất cứ điều gì nhiều hơn hoặc ít thanh lịch. – sharptooth

3

Luôn luôn có những CoTreatAsClass chức năng: http://msdn.microsoft.com/en-us/library/ms693452(VS.85).aspx

Nhưng, như bạn đã nói, nó sẽ là một sự thay thế cho toàn hệ thống của lớp, không phải là một sự thay đổi địa phương.

Ngoài ra, bạn có thể xem xét việc gắn kết CoCreateInstance như được đề xuất trong bài đăng được tham chiếu bằng nhận xét của Shay Erlichmen.

Các vấn đề liên quan