2008-08-20 7 views

답변

2

물론입니다. 아주 쉽습니다. 여기에 함께 던진 재미있는 앱이 있습니다. Visual C++ 있다고 가정합니다.

저장 Test.cpp에 컴파일합니다 : CL.EXE/EHsc의 Test.cpp에

당신의 OCX 함께 테스트하려면 당신에게 어느 형식 라이브러리 # import를 필요로하고 CLSID (또는 하드 코드의 사용합니다 CLSID)를 CoCreateInstance 호출에 추가합니다. #import를 사용하면 필요한 맞춤 인터페이스를 정의하는 데 도움이됩니다.

 
#include "windows.h" 
#include "shobjidl.h" 
#include "atlbase.h" 

// 
// compile with: cl /EHsc test.cpp 
// 

// A fun little program to demonstrate creating an OCX. 
// (CLSID_TaskbarList in this case) 
// 

BOOL CALLBACK RemoveFromTaskbarProc(HWND hwnd, LPARAM lParam) 
{ 
    ITaskbarList* ptbl = (ITaskbarList*)lParam; 
    ptbl->DeleteTab(hwnd); 
    return TRUE; 
} 

void HideTaskWindows(ITaskbarList* ptbl) 
{ 
    EnumWindows(RemoveFromTaskbarProc, (LPARAM) ptbl); 
} 

// ============ 

BOOL CALLBACK AddToTaskbarProc(HWND hwnd, LPARAM lParam) 
{ 
    ITaskbarList* ptbl = (ITaskbarList*)lParam; 
    ptbl->AddTab(hwnd); 

    return TRUE;// continue enumerating 
} 

void ShowTaskWindows(ITaskbarList* ptbl) 
{ 
    if (!EnumWindows(AddToTaskbarProc, (LPARAM) ptbl)) 
     throw "Unable to enum windows in ShowTaskWindows"; 
} 

// ============ 

int main(int, char**) 
{ 
    CoInitialize(0); 

    try { 
     CComPtr<IUnknown> pUnk; 

     if (FAILED(CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**) &pUnk))) 
      throw "Unabled to create CLSID_TaskbarList"; 


     // Do something with the object... 

     CComQIPtr<ITaskbarList> ptbl = pUnk; 
     if (ptbl) 
      ptbl->HrInit(); 

     HideTaskWindows(ptbl); 
     MessageBox(GetDesktopWindow(), _T("Check out the task bar!"), _T("StackOverflow FTW"), MB_OK); 
     ShowTaskWindows(ptbl); 
    } 
    catch(TCHAR * msg) { 
     MessageBox(GetDesktopWindow(), msg, _T("Error"), MB_OK); 
    }  

    CoUninitialize(); 

    return 0; 
} 
3

OCX가 ActiveX 사용자 컨트롤이 아니십니까? (사용자가 상호 작용할 수 있도록 양식에 넣은 것)?

COM/ActiveX를 테스트하는 가장 쉬운 방법은 Excel을 사용하는 것입니다. (네, 그것은 바보 같은 소리로 들리 겠지만 나와 함께 부담) 당신은 엑셀이있는 경우는 (Visual Basic 편집기를 실행 할 수

  • 을 눌러 Alt+F11이 일을하지 않은 경우

    1. 실행 Excel에서, 새로운 파일을 생성 2007 그것은 Tools 메뉴에서

      1. , References ...를 선택합니다 '개발자'리본 탭 것은 지금 당신은 행복 Visual Basic의 땅에서 걸

      에의

    2. 목록에서 OCX/COM 개체를 선택하거나 Browse...을 클릭하여 COM에 등록되지 않은 파일을 찾습니다. OCX가 이미 등록 된 경우이 단계를 건너 뛸 수 있습니다. Insert 메뉴에서
    3. 마우스 오른쪽 버튼으로 클릭하고 Additional Controls
    4. 선택 목록에서 OCX를 찾아서는
    5. 그런 다음에 도구 상자에서 OCX를 드래그 할 수 있습니다 틱, 부동 Toolbox 창에서 UserForm
    6. 을 선택 userform
    7. Run 메뉴에서 실행하십시오.
    8. OCX를 테스트하고 함께 놀아보십시오.

    9. 엑셀 파일을 저장하면 매번이 단계를 반복하지 않아도됩니다.

  • +0

    이 방법으로는 작동하지 않는 창없는 OCX 모듈이 있습니다. –

    1

    @orion 너무 멋지다. 그렇게 생각하지 마십시오.

    잘 @jschroedl thats는 참으로 재미있었습니다.

    콘솔 앱에서 activex를 테스트하는 것은 재미 있습니다. 그러나 나는 그 길을 시도하지 않는 것이 가치 있다고 생각한다. @jschroedl이 설명한 방법을 통해 메서드를 호출하거나 속성을 설정하거나 가져올 수 있으며 Invoke 함수를 통해 IDIspatch 개체를 호출 할 수 있습니다.

    첫 번째 단계는 GetIDsByName을 호출하고 Invoke를 통해 함수를 호출하고 함수의 매개 변수는 Invoke 형식 매개 변수 목록의 VARIANTS 배열이어야합니다.

    모두 훌륭하고 멋쟁이입니다. 그러나 일단 당신이 거기에서 내리막 길에 도착하면. Windows 응용 프로그램에서는 이벤트를 발생시키는 메시지 펌프가 필요합니다. 콘솔에는 콘솔이 없습니다. 클래식 C++ 방식으로 콜백 인터페이스를 구현하는 것처럼 EventNotifier를 구현하는 경로를 따라 갔다. 그러나 이벤트는 구현 된 인터페이스로 전달되지 않습니다.

    저는 콘솔 응용 프로그램에서이 작업을 수행 할 수 없다고 확신합니다. 하지만 콘솔 응용 프로그램에서 다른 사람이 이벤트를 처리하기를 바라고 있습니다.

    관련 문제