2008-08-20 27 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

是不是一個ActiveX用戶控件的OCX? (你放在表單上供用戶進行交互的東西)?

我知道測試COM/ActiveX的最簡單方法就是使用excel。 (是的,我知道這聽起來很愚蠢,多多包涵)

  1. 運行Excel,創建一個新的文件,如果它沒有這樣做對你
  2. Alt+F11啓動Visual Basic編輯器(如果您有Excel 2007年它是在「開發者」功能區選項卡的事情

現在你在快樂的Visual Basic土地是......

  1. Tools菜單中,選擇References
  2. 從列表中選擇您的OCX/COM對象,或者點擊Browse...查找未註冊COM的文件 - 如果您的OCX已經註冊,您可以跳過此步驟。
  3. Insert菜單中,選擇UserForm
  4. 在浮動Toolbox窗口中,右鍵單擊並選擇Additional Controls
  5. 在列表中找到您的OCX和打勾
  6. 然後,您可以從工具箱拖動OCX到用戶表單
  7. Run菜單運行它。
  8. 測試你的OCX並玩弄它。

  9. 保存EXCEL文件,所以你不必每次重複這些步驟。

+0

儘管存在無窗口的OCX模塊,但此方法不起作用。 – 2014-02-04 18:06:49

1

@orion多數民衆贊成如此酷。從來沒有這樣想過。

那麼@jschroedl多數民衆贊成在確實很有趣。

在控制檯應用程序中測試activex很有趣。但我認爲它的價值不在試圖走這條道路。您可以通過@jschroedl解釋的方式調用方法或設置屬性,也可以通過Invoke函數調用IDIspatch對象。

第一步是GetIDsByName並通過Invoke調用該函數,並且該函數的參數應該是Invoke形式參數列表中的VARIANTS數組。

一切都很好,花花公子。但一旦你從那裏開始下坡活動。 Windows應用程序需要消息泵才能觸發事件。在控制檯上你沒有一個。我沿着這條路走下去,爲事件實現EventNotifier,就像使用經典C++方式實現CallBack接口一樣。但是這些事件並沒有達到你的實現接口。

我很確定這不能在控制檯應用程序上完成。但我真的希望有人會在控制檯應用程序中採用不同的事件