2008-08-20 33 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を使用することです。 (はい、私は、それがダム音を知っている私と一緒にクマ)Excelを持っている場合、それは(Visual Basicエディターを起動します

  • 押しAlt+F11ためにこれを行っていない場合

    1. ランExcelは、新しいファイルを作成します2007それはReferencesを選択し、...今、あなたは幸せVisual Basicの土地にいることを「開発者リボンタブの事

    Toolsメニューから

    1. です
    2. リストからOCX/COMオブジェクトを選択するか、Browse...をクリックしてCOMに登録されていないファイルを探します。OCXが既に登録されている場合は、この手順をスキップできます。 Insertメニューから
    3. 、浮動ToolboxウィンドウでUserForm
    4. を選択し、右Additional Controls
    5. リストにあなたのOCXを見つけ、あなたはその後、上にツールボックスから、あなたのOCXをドラッグすることができ
    6. それをチェックをクリックして選択ユーザーフォーム
    7. Runメニューから実行します。
    8. OCXをテストして、それを試してみてください。

    9. エクセルファイルを保存するので、毎回これらの手順を繰り返す必要はありません。

  • +0

    この方法ではうまくいかないウィンドウレスOCXモジュールがあります。 –

    1

    @orion thats so cool。そのように考えたことはありません。

    よく@jschroedl thatsは本当に面白かったです。

    コンソールアプリケーションでのActiveXのテストは楽しいです。しかし、私はその道を試す価値がないと思う。メソッドを呼び出したり、@ jschroedlが説明した方法でプロパティを設定したり取得したりできます。また、Invoke関数を通じてIDIspatchオブジェクトを呼び出すこともできます。

    最初のステップは、GetIDsByNameを呼び出して関数を呼び出すことです。関数のパラメータは、Invoke仮パラメータ・リストのVARIANTSの配列にする必要があります。

    すべてが上品で素敵です。しかし、一度あなたはそこから下り坂のイベントに出ます。 Windowsアプリケーションでは、イベントを発生させるためにメッセージポンプが必要です。コンソールには持っていません。私は、古典的なC++の方法でCallBackインターフェイスを実装するのと同じように、イベントのEventNotifierを実装する方法を説明しました。しかし、イベントはあなたの実装されたインターフェイスには達しません。

    これはコンソールアプリケーションでは実行できないと私は確信しています。しかし、私は実際にコンソールアプリケーションのイベントを別のものにすることを望んでいます

    関連する問題