2009-07-17 39 views
6

Tôi đang cố gắng xây dựng một ứng dụng sử dụng thành phần COM trong VisualStudio ´05 trong C++ gốc. Sự pha trộn của desciptions bản địa và quản lý của sự vật trong MSDN hoàn toàn wrecked não của tôi. (Tôi nghĩ MSDN là tổng số lộn xộn về khía cạnh đó) Tôi cần một mẫu C++ có nguồn gốc ngắn và đơn giản để tải Thành phần của tôi và làm cho nó có thể sử dụng được. Tôi ổn với trình biên dịch tạo trình bao bọc và những thứ tương tự.Làm thế nào tôi có thể dễ dàng sử dụng một thành phần COM trong Native Visual C++

Vui lòng không thông báo cho tôi sử dụng ví dụ MFC dựa trên hộp thoại, vì nó không hoạt động với thành phần này và tự nó là một mã số lớn ... .

Đây có phải là vấn đề gốc so với com được quản lý không?

Tôi hoàn toàn bị mất, vui lòng cho tôi một số vòng bi ...

EDIT: Cảm ơn mọi sự trợ giúp. Vấn đề của tôi là tất cả những gì tôi có là một dll đã đăng ký (thực sự là OCX, xem bên dưới) . Tôi (cá nhân) biết Giao diện sẽ trông như thế nào, nhưng làm cách nào để tôi nói với chương trình của mình? Không có tiêu đề xác định ID cho Giao diện mà tôi có thể sử dụng. Nhưng tôi đọc rằng trình biên dịch C++ có thể trích xuất và gói nó lên cho tôi. Bất cứ ai biết làm thế nào điều này được thực hiện?

KIỂM TRA: Tôi chỉ có OCX và một đầu mối từ tài liệu của thành phần, phương pháp nào cần hiển thị.

Trả lời

3

dụ Hoàn toàn lao động (chính xác những gì bạn cần) từ bài viết blog của tôi: How to Call COM Object from Visual Studio C++?

// https://helloacm.com/how-to-call-com-object-from-visual-studio-c/ 
#include <iostream> 
#include <objbase.h> 
#include <unknwn.h> 
#include <Propvarutil.h> 
#import "wshom.ocx" no_namespace, raw_interfaces_only 

using namespace std; 

int main() { 
    HRESULT hr; 
    CLSID clsid; 
    CoInitializeEx(nullptr, COINIT_MULTITHREADED); 
    CLSIDFromProgID(OLESTR("WScript.Shell"), &clsid); 
    IWshShell *pApp = nullptr; 
    hr = CoCreateInstance(clsid, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWshShell), reinterpret_cast<LPVOID *>(&pApp)); 
    if (FAILED(hr) || pApp == nullptr) { 
     throw "Cannot Create COM Object"; 
    } 
    int out; 
    VARIANT s; 
    InitVariantFromInt32(0, &s); 
    VARIANT title; 
    InitVariantFromString(PCWSTR(L"title"), &title); 
    VARIANT type; 
    InitVariantFromInt32(4096, &type); 
    BSTR msg = ::SysAllocString(L"Hello from https://helloacm.com"); 
    pApp->Popup(msg, &s, &title, &type, &out); 
    CoUninitialize(); 
    cout << "Out = " << out; 
    return 0; 
} 
3

Tôi hoan nghênh nỗ lực của bạn để đi với mẹ đẻ C++ để đối phó với COM - bạn cần phải đi qua nỗi đau để thực sự đánh giá cao hiện nay sang trọng (quản lý) môi trường phát triển :)

Quay lại khi thế giới (và tôi) là trẻ hơn, cuốn sách của Kraig Brockshmidt "Inside OLE" là số để tạo cảm giác COM (trước COM thậm chí là COM). Cuốn sách này có trước mã được quản lý, vì vậy không có cơ hội nhầm lẫn được quản lý ở đây. Có một ấn bản thứ hai nữa.

Sách của Don Box "Essential COM" và "Effective COM" sau này, nhưng bổ sung chào mừng bạn đến cửa hàng của kiến ​​thức COM (không được quản lý).

Tuy nhiên, nếu ví của bạn không mở rộng để có được những cuốn sách cũ bụi bặm, tài liệu hướng dẫn COM của Microsoft here có thể giúp bạn đi đúng hướng.

Hacking vui nhộn.

+0

Vâng. Cảm ơn :). Tôi có thể nói: "Tôi không đọc!" nhưng đó sẽ không phải là một sự chuyển đổi nghề nghiệp tốt, nó sẽ;) – AndreasT

2

Số tiền tối thiểu để khởi tạo đối tượng COM như sau:

1) Phải có căn hộ COM.

Điều này được thực hiện bởi hầu hết các ứng dụng bằng cách gọi CoInitialize/CoInitializeEx để thiết lập thư viện COM và căn hộ COM ban đầu nếu đây là lần đầu tiên xử lý.

2) Gọi CoCreateInstance/CoCreateInstanceEx để tạo một đối tượng và chỉ định cờ để biểu thị cách nó sẽ được khởi tạo.

3) Cân bằng đúng cuộc gọi của AddRef và phát hành trên giao diện của bất kỳ thành phần COM nào mà bạn tạo, gọi Phiên bản cuối cùng() khi bạn hoàn thành việc sử dụng thành phần COM.

-

Trong ứng dụng được quản lý, # 1 hầu như luôn được xử lý cho bạn. # 2 là tóm tắt đi nếu bạn nhập một tham chiếu đến một thư viện COM, và bạn chỉ có thể sử dụng các tên đã nhập như thể chúng là các định nghĩa lớp .NET và như vậy. # 3 được tự động xử lý cho bạn, nhưng nhu cầu của bạn có thể thay đổi. Thật không may, đôi khi có quirks trong cách tham chiếu được xử lý trong các ứng dụng quản lý, mà có thể gây ra các đối tượng COM để dính xung quanh lâu hơn dự định. Lớp trợ giúp Marshal trong System.Runtime có các phương thức có thể giúp bạn ở ngoài đó nếu bạn gặp phải vấn đề.

-

Trong ứng dụng không được quản lý, bạn sẽ phải thực hiện một số tác vụ nếu bạn tạo ứng dụng từ đầu.

  1. Gọi CoInitialize/CoInitializeEx sớm trong chủ đề chính của ứng dụng để thiết lập căn hộ.
  2. Khi chuỗi chính của ứng dụng sắp thoát, hãy gọi CoUninitialize() để đóng căn hộ.
  3. Đối với các chủ đề bổ sung mà bạn tạo, bạn cũng nên gọi CoInitialize/CoInitializeEx khi chúng bắt đầu nếu bạn cần sử dụng các đối tượng COM từ các chủ đề đó. Ngoài ra, tùy thuộc vào ứng dụng của bạn, bạn có thể muốn thiết lập các thông số căn hộ.
  4. Đối với các chủ đề đó, hãy gọi CoUninitialize() khi chúng thoát ra để dọn dẹp đúng cách.
1

Sẽ hữu ích nếu bạn cung cấp thêm một chút thông tin về những gì bạn đang làm chính xác. Bạn có biết giao diện thực hiện đối tượng, v.v. không?

Nói chung, API mà bạn có thể giúp Google cụ thể hơn là CoCreateInstance. Bạn sẽ cần phải vượt qua nó GUID của đối tượng bạn muốn chơi với. Tất cả các đối tượng COM thực hiện giao diện IUnknown và bạn có thể truy vấn bất kỳ đối tượng nào khác mà nó có thể có. Vì vậy, một số giả mã mẫu để giúp bạn bắt đầu có thể trông giống như sau:

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 
CoCreateInstance(CLSID, 
         ptrIUnknown, 
         ClassCxt, // generally CLSCTX_INPROC_SERVER, 
         riid , // reference id 
         (void **)&pRequest); // the interface that corresponds to the riid 

Tại đây bạn có thể truy vấn các giao diện bổ sung bằng giao diện IUnknown mà bạn nhận được từ ptrIUnknown.

Sau đó dọn dẹp với COM Essential

CoUninitialize() 

Don Box là một cuốn sách tuyệt vời về chủ đề này. Ngoài ra, chỉ để thử nghiệm làm thế nào đối tượng COM của bạn hoạt động, sử dụng một cái gì đó như VBScript làm cho điều này siêu dễ dàng. Ngoài ra, nó có thể xứng đáng lưu ý rằng GUID của lớp ID được lưu trữ trong một cách hơi khác thường, vì vậy nếu bạn chỉ trích một GUID từ sổ đăng ký, bạn có thể có một số khó khăn trong việc tìm ra thứ tự. Đó có lẽ là một câu hỏi khác.

+1

Essential COM: +1 –

1

Tôi sử dụng kết hợp các con trỏ COM thông minh ATL và lớp ATL :: CAxWindow cho các đối tượng và thành phần COM. Tôi tìm thấy các con trỏ thông minh đặc biệt dễ sử dụng.

http://www.murrayc.com/learning/windows/usecomfromatl.shtml

http://76.105.92.243/notes/atlcom.html#import

http://msdn.microsoft.com/en-us/library/yx242b61%28VS.80%29.aspx

+0

Cảm ơn các liên kết, số 2 trông thực sự hứa hẹn. Nó sẽ mất đến ngày mai để phân tích tất cả những điều này: | – AndreasT

+0

Tôi muốn biết tại sao một người nào đó đã bỏ phiếu này! Tôi chỉ cố giúp thôi. – Rob

+0

Vâng và bạn đã thành công. Cảm ơn. – AndreasT

0

Hãy thử sử dụng #import từ Visual C++. Điều này sẽ tạo ra các trình bao bọc con trỏ thông minh cho các giao diện.

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