2009-06-24 42 views
5

Hãy xem xét tôi là người mới làm quen với môi trường cửa sổ và lập trình COM.Tự động hóa COM sử dụng tệp tlb

Tôi phải tự động truy cập ứng dụng (CANoe). CANoe cho thấy chính nó như là một máy chủ COM và cung cấp các tập tin CANoe.h, CANoe_i.c và CANoe.tlb. Bất cứ ai có thể chỉ định cách viết ứng dụng khách C++, để truy cập đối tượng, chức năng của ứng dụng.

Ngoài ra, vui lòng chỉ định cách truy cập mã có trong tệp tlb từ C++.

Trả lời

9

Visual studio có rất nhiều hỗ trợ cho việc nhập thư viện kiểu vào dự án C++ của bạn và sử dụng các đối tượng do đó được xác định. Ví dụ, bạn có thể sử dụng #import chỉ:

#import "CANoe.tlb" 

này sẽ nhập khẩu các thư viện kiểu, và chuyển nó sang tập tin tiêu đề và các file thực thi - cũng có thể nó sẽ khiến các tệp thi hành được xây dựng với dự án của bạn và tiêu đề các tệp được đưa vào, vì vậy đây là rất nhiều thứ ma thuật ngay tại đó.

Sau đó, bạn nhận được rất nhiều typedef cho trình bao bọc con trỏ thông minh cho các loại và đối tượng được xác định trong thư viện kiểu. Ví dụ, nếu có một CoClass gọi Application mà thực hiện giao diện IApplication, bạn có thể làm điều này:

ApplicationPtr app(__uuidof(Application)); 

Điều này sẽ gây tại thời gian chạy, ứng dụng coclass được tạo ra và bị ràng buộc vào biến app, và bạn có thể gọi vào nó như vậy:

app->DoSomeCoolStuff(); 

Lỗi xử lý được thực hiện bằng cách kiểm tra kết quả của các cuộc gọi COM, và ném ngoại lệ _com_error thích hợp cần thiết vì vậy đây ngụ ý là bạn cần phải viết ngoại lệ an toàn.

1

Sử dụng import chỉ thị để nhập tệp .tlb - điều này sẽ cung cấp cho bạn một C++ tương đương với các giao diện được hiển thị bởi thành phần COM.

Bạn cũng sẽ cần phải đăng ký thành phần COM vào sổ đăng ký (chạy regsvr32 trên tệp .dll của thành phần). Sau đó, bạn có thể gọi CoCreateInstance() (hoặc _com_ptr_t :: CreateInstance() vì nó thường thuận tiện hơn) để tạo một thể hiện của lớp thực hiện giao diện. Sau đó bạn có thể gọi các phương thức của giao diện - nó sẽ hoạt động gần giống như cách nó là một giao diện và lớp C++ đơn giản.

+0

Nhờ tất cả cho phản ứng nhanh chóng. Tôi không có tệp DLL cho ứng dụng, vì vậy sẽ thích cách tiếp cận này. Nhận các lỗi biên dịch sau, sau #import "CANoe.tlb" trong tệp nguồn của tôi. - ký tự không xác định '0x1' - lỗi cú pháp: thiếu ';' trước số nhận dạng 'A' - thiếu thông số định kiểu - int giả định. Lưu ý: C++ không hỗ trợ mặc định-int - '{': thiếu tiêu đề chức năng (danh sách chính thức kiểu cũ?) Hãy đề xuất, nếu tôi thiếu một số bước. Có cách nào để xác minh nội dung tệp .tlb và giải quyết các lỗi này không. Cảm ơn trước –

+0

Tôi đề nghị bạn cố gắng giải quyết nó và nếu bạn không quản lý chỉ cần hỏi một câu hỏi riêng biệt cung cấp đủ chi tiết. – sharptooth

0

Cách dễ dàng hơn là bao gồm cả dự án .h và _i.c trong tệp .cpp của bạn bằng cách sử dụng các câu lệnh #include.

Vì bạn chưa được cung cấp dll và chỉ có tlb được cung cấp, bạn có thể đăng ký tlb bằng regtlibv12.exe là một phần của studio trực quan (đây là phiên bản VS2005). Bằng cách đăng ký tlb, các mục thích hợp sẽ được thực hiện trong sổ đăng ký và sau đó bạn có thể sử dụng chức năng thư viện COM khi cần.

EDIT: BTW, bạn cần DLL anyway để khởi tạo thành phần COM thành công.

Để tạo ra một con trỏ giao diện, một trong những cách an toàn hơn là sử dụng CComPTR như:

 

CComPtr myPtr; 
myPtr.CoCreateInstance(__uuidof("ClassNamehere")); 
myPtr->Method(....); 

 
+0

Nếu anh ta không có DLL, anh ta sẽ không thể khởi tạo thành phần và gỡ lỗi chương trình khách hàng của mình. – sharptooth

+0

Có, nhưng hoàn toàn có thể là tệp tlb chỉ chứa các định nghĩa giao diện và cần được đăng ký riêng. Bạn có quyền về DLL mặc dù rằng ông nên có nó để nhanh chóng thành phần. – Aamir

+0

Vâng, bạn đúng về đăng ký tlb riêng biệt có thể. Nhưng đó là một thực hành nghỉ mát cuối cùng thường được sử dụng khi thành phần COM có hỗ trợ COM không đầy đủ và không hỗ trợ DllRegisterServer và DllGetClassObject. – sharptooth

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