2009-07-17 2 views
6

네이티브 C++에서 VisualStudio '05 의 COM 구성 요소를 사용하는 응용 프로그램을 빌드하려고합니다. MSDN에있는 네이티브 및 매니지드 구문의 혼합은 내 두뇌를 완전히 파괴했습니다. (나는 MSDN이 그 점에서 완전히 엉망이라고 생각한다.) 간단하고 간단한 네이티브 C++ 샘플 코드가 필요하다. 내 구성 요소를로드하고 사용할 수있게 만든다. . 래퍼 등을 만드는 컴파일러에 대해 잘 알고 있습니다.네이티브 Visual C++에서 COM 구성 요소를 쉽게 사용할 수있는 방법

이 구성 요소에서 작동하지 않고 그 자체로 거대한 더미의 ... 코드이기 때문에 다이얼로그 기반 MFC 예제를 사용하지 말 것을 권유하십시오.

이 문제는 기본 com 대 관리 com 일 수 있습니까? 모든 도움을 주셔서 감사합니다 :

나는 완전히 상실하고

, ... 나에게

편집을 일부 베어링을주지하시기 바랍니다. 내 문제는 등록 된 dll (실제로는 OCX, 아래 참조)입니다. . 나 (개인적으로) 인터페이스가 어떻게 보이는지 알아야하지만 내 프로그램을 어떻게 말할까요? 사용할 수있는 인터페이스에 대해 ID를 정의하는 헤더가 없습니다. 하지만 나는 C++ 컴파일러 을 추출하여 포장 할 수 있다고 읽었습니다. 누구나 이것이 어떻게 이루어 졌는지 알 수 있습니까?

CLARIFICATION : 구성 요소의 설명서 의 OCX와 단서 만 있습니다. 어떤 메서드를 노출해야합니까?

답변

3

완전 작업 예 (정확하게 당신이 필요) 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

내가 COM 다루는 네이티브 C++ 갈 당신의 노력에 박수를 보냅니다 - 진정으로 오늘날의 고급스러운 (관리) 감사하는 당신이 고통을 통과하는 개발 환경 :

돌아 가기

세계 (내가)가 필요했다 젊은, Kraig Brockshmidt의 책 "Inside OLE"은 이었고 COM의 의미를 만들기위한 (COM 이전에도 COM 임)입니다. 이 책은 관리 코드보다 선행하므로 관리 혼란의 위험이 없습니다. 두 번째 에디션도 있습니다.

"Essential COM"및 "Effective COM"은 나중에 나왔지만 (비 관리) COM 지식 저장소에 대한 추가를 환영합니다.

그러나 지갑이 먼지가 많은 오래된 책을 구입할 때까지 확장되지 않으면 Microsoft COM 자습서 자료 here을 사용하면 올바른 방향으로 이동할 수 있습니다.

해피 해킹. 다음과 같이 COM 개체를 인스턴스화

+0

음. 감사 :). 나는 말할 수있다 : "나는 읽지 않는다!" 하지만 그건 좋은 직업 이동하지 않을 것입니다;) – AndreasT

2

베어 최소는 다음과 같습니다

1)는 COM 아파트 사용할 수 있어야합니다.

대부분의 응용 프로그램에서는 COM 라이브러리와 프로세스를 처음 사용할 경우 초기 COM 아파트를 설치하기 위해 CoInitialize/CoInitializeEx를 호출하여이 작업을 수행합니다.

2) CoCreateInstance/CoCreateInstanceEx를 호출하여 개체를 만들고 인스턴스화 방법을 나타내는 플래그를 지정합니다.

3) 작성한 모든 COM 구성 요소의 인터페이스에서 AddRef 및 Release 호출의 균형을 올바르게 조정하고 COM 구성 요소 사용을 마쳤 으면 마지막 Release()를 호출합니다.

- 관리되는 응용 프로그램에서

는 # 1은 거의 항상 당신을 위해 처리됩니다. # 2는 COM 라이브러리에 대한 참조를 가져 오는 경우 추상화되며 가져온 이름은 .NET 클래스 정의 등으로 사용하면됩니다. # 3은 자동으로 처리되지만 필요에 따라 다를 수 있습니다. 안타깝게도 관리되는 응용 프로그램에서 참조가 처리되는 방식이 때때로 복잡하기 때문에 COM 개체가 의도 한 것보다 오래 걸릴 수 있습니다. System.Runtime의 Marshal 도우미 클래스에는 문제가 발생할 경우 도움을 줄 수있는 메서드가 있습니다.

- 관리되지 않는 응용 프로그램에서

, 당신은 당신이 처음부터 응용 프로그램을 만드는 경우 몇 가지 마술을 할 것입니다.

  1. CoInitialize/CoInitializeEx를 호출하여 응용 프로그램의 주 스레드에서 초기에 아파트를 설정하십시오.
  2. 응용 프로그램의 주 스레드가 종료 될 때 CoUninitialize()를 호출하여 아파트를 닫습니다.
  3. 작성한 추가 스레드의 경우 해당 스레드에서 COM 개체를 사용해야하는 경우 시작할 때 CoInitialize/CoInitializeEx를 호출해야합니다. 또한 응용 프로그램에 따라 아파트 매개 변수를 설정할 수도 있습니다.
  4. 이러한 스레드의 경우 정리를 올바르게 종료 할 때 CoUninitialize()를 호출 할 수도 있습니다.
1

정확히 무엇을하고 있는지에 대한 정보를 조금 더 제공하면 도움이됩니다. 객체가 구현하는 인터페이스 등을 알고 있습니까?

그러나 일반적으로 Google에서보다 구체적인 도움을 제공 할 수있는 API는 CoCreateInstance입니다. 함께 연주하려는 객체의 GUID를 전달해야합니다. 모든 COM 개체는 IUnknown 인터페이스를 구현하고있을 수있는 다른 개체를 쿼리 할 수 ​​있습니다. 당신이 ptrIUnknown에서 얻은 IUnknown 인터페이스를 사용하여 추가 인터페이스를 조회 할 수 있습니다 여기에

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

: 그래서 일부 샘플 의사는 당신이 뭔가를 보일 수 있습니다 시작합니다.

그런

CoUninitialize() 

돈 상자의 필수 COM으로 정리하는 것은이 주제에 좋은 책이다. 또한 VBScript와 같은 것을 사용하여 COM 개체가 작동하는 방식을 테스트하기 위해이 슈퍼를 쉽게 만들 수 있습니다. 또한 클래스 ID의 GUID는 다소 특이한 방식으로 저장되므로 레지스트리에서 GUID 만 추출하면 순서를 알아 내는데 어려움이있을 수 있습니다. 그것은 아마 다른 질문을위한 것입니다.

+1

필수 COM : +1 –

1

COM 개체와 구성 요소에 대해 ATL 스마트 COM 포인터와 ATL :: CAxWindow 클래스를 조합하여 사용합니다. 스마트 포인터는 특히 사용하기가 쉽습니다. http://76.105.92.243/notes/atlcom.html#import

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

+0

링크 주셔서 감사합니다, 번호 2는 정말 유망 보인다. 내일까지이 모든 것을 파싱해야합니다 : | – AndreasT

+0

누군가가 이것을 왜 투표했는지 알고 싶습니다. 나는 단지 도우려고했다. – Rob

+0

음, 그리고 당신은 성공했습니다. 감사. – AndreasT

관련 문제