2009-11-17 3 views
6

Tôi muốn phát triển điều khiển ActiveX và vì tôi không sở hữu studio trực quan, tôi tự hỏi liệu tôi có thể sử dụng phiên bản VisualC++ express trên riêng của mình hay tôi cũng cần SDK nền tảng Windows?Phát triển các điều khiển ActiveX

+0

Tôi không có cài đặt phiên bản VC++ Express. Tùy chọn nào cung cấp cho bạn khi bạn chọn "Tệp> Mới> Dự án ..."? – ChrisF

+0

Rất ít. Thư viện lớp, Ứng dụng CLR Console, CLR Empty Project, Ứng dụng Windows Forms, Ứng dụng giao diện điều khiển Win32, Dự án Win32, Dự án trống. Tôi nghĩ tôi muốn viết một ứng dụng DLL. – Matt

Trả lời

11

Bạn không cần Visual Studio để viết điều khiển X đang hoạt động. Một điều khiển Active X chỉ đơn giản là một đối tượng COM được đăng ký theo một cách cụ thể thực hiện IUnknown và IObjectSafety.

Bạn không cần tạo dự án Visual Studio Active X. Bạn chỉ có thể tạo một DLL thông thường, thêm tệp kê khai thích hợp và cab nó bằng cách sử dụng các công cụ CAB SDK.

Bạn không phải sử dụng ATL để viết điều khiển X đang hoạt động. Trong thực tế, bạn có thể tốt hơn không sử dụng nó cho đến khi bạn hiểu cách các giao diện OLE hoạt động như thế nào trong mô hình mở rộng của IE.

Vì vậy, có, bạn sẽ ổn với Visual Studio Express.

EDIT:

  • Bạn nên bắt đầu với Introduction to Active X Controls.
  • Đây là CAB SDK.
  • Bạn nên không có vấn đề tìm ví dụ cho các điều khiển ActiveX cơ bản bằng cách tìm kiếm google, vv

Dưới đây là một biểu hiện mẫu, gọi YOURCONTROL.inf. Rõ ràng thay thế YOURCONTROL bằng bất cứ điều gì bạn gọi cho anh chàng của bạn, và tạo ra GUID và số phiên bản của riêng bạn. Đây là tệp kê khai tối thiểu bạn cần.

[version] 
signature="$CHICAGO$" 
AdvancedINF=2.0 

[Add.Code] 
YOURCONTROL.dll=YOURCONTROL.dll 

[YOURCONTROL.dll] 
file-win32-x86=thiscab 
clsid={11111111-2222-3333-4444-555555555555} 
FileVersion=1,2,3,4567 
RegisterServer=yes 

Bạn sẽ cần tệp chuẩn .DEF trong dự án liệt kê các hàm được xuất cần thiết cho COM và tự đăng ký. DllGetClassObject là nơi COM sẽ gọi cho bạn để có được nhà máy lớp cho đối tượng COM của bạn. RegisterServer và UnregisterServer là nơi bạn nên viết trạng thái ban đầu của mình vào sổ đăng ký (ví dụ: đăng ký đối tượng COM của bạn, v.v.).

EXPORTS 
    DllCanUnloadNow    PRIVATE 
    DllGetClassObject PRIVATE 
    DllRegisterServer PRIVATE 
    DllUnregisterServer PRIVATE 

Bạn cũng sẽ cần tệp IDL để có thể định nghĩa đối tượng COM của đối tượng để có thể gọi từ tập lệnh và có thể kích hoạt sự kiện cho Javascript.Một cái gì đó như thế này:

import "oaidl.idl"; 
import "ocidl.idl"; 

#include "dispids.h" // <-- define your DISPIDs here 

[ 
     uuid(<<generate your own guid here>>), 
     version(1.0), 
] 
library YOURCONTROLLIBRARY 
{ 
    [ 
     uuid(<<generate your own guid here>>), 
     hidden 
    ] 
    dispinterface DYOURCONTROLEvents 
    { 
     properties: 
     methods: 
     // Add outgoing events here. 
     [id(DISPID_SOME_EVENT)] void SomeEvent(); 
    } 

    [ 
     dual, 
     uuid(<<generate your own guid here>>) 
    ] 
    interface IYOURCONTROL : IDispatch 
    { 
     // Add methods and properties here. 
     [id(DISPID_SOMEMETHOD)] HRESULT SomeMethod([in] BSTR bstrFoo); 
    } 

    [ 
     uuid(<<generate your own guid here>>) 
    ] 
    coclass YOURCONTROLCtl 
    { 
     [default] interface IYOURCONTROL; 
     [source, default] dispinterface DYOURCONTROLEvents; 
    } 
} 

Và, cuối cùng, điểm vào DLL bạn nên tìm một cái gì đó như thế này:

HINSTANCE g_hInstance; 
LONG g_nDllRefs; 

extern "C" 
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { 
    switch (dwReason) { 
     case DLL_PROCESS_ATTACH: 
      g_hInstance = hInstance; 
      g_nDllRefs = 0; 
      break; 

     case DLL_PROCESS_DETACH: 
      break; 
    } 

    return true; 
} 

// Call this whenever you create your object to keep your DLL loaded. 
void DllAddRef() { 
    InterlockedIncrement(&g_nDllRefs); 
} 

// Call this when your object is destroyed. 
void DllRelease() { 
    InterlockedDecrement(&g_nDllRefs); 
} 

STDAPI DllCanUnloadNow() { 
    return (g_nDllRefs == 0 ? S_OK : S_FALSE); 
} 

// This is where you create your class factory. See the IClassFactory documentation on msdn. 
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { 
    HRESULT hr; 
    if (rclsid == CLSID_YOUROBJECTCtl) { 
     CYOUROBJECTFactory *pYOUROBJECTFactory = new CYOUROBJECTFactory; 
     if (pYOUROBJECTFactory == NULL) { 
      hr = E_OUTOFMEMORY; 
     } else { 
      hr = pYOUROBJECTFactory ->QueryInterface(riid, ppv); 
     } 
    } else { 
     hr = CLASS_E_CLASSNOTAVAILABLE; 
    } 
    return hr; 
} 

STDAPI DllRegisterServer() { 
    // Write your registry keys for registering your ActiveX COM Object here. 
    return S_OK; 
} 

STDAPI DllUnregisterServer() { 
    // Delete your registry keys here. 
    return S_OK; 
} 
+0

Cảm ơn rất nhiều. Bạn có thể cung cấp cho tôi một liên kết mô tả quy trình và đưa ra các ví dụ đơn giản không? – Matt

+0

Vậy thì sao? –

+0

Thankyou. Đó là một khởi đầu tuyệt vời. – Matt

0

này Microsoft Support post từ năm 2006 sẽ chỉ ra rằng bạn có thể sử dụng phiên bản VC++ Express cho việc phát triển các điều khiển ActiveX:

Áp dụng

Microsoft ActiveX Template Library 3.0, khi được dùng với:
Microsoft Visual C++ 6.0 Enterprise Edition
Microsoft Visual C++ 6.0 phiên bản chuyên nghiệp
Microsoft Visual C++, phiên bản học 32 bit 6.0
Microsoft Visual C++ 2005 Express Edition
Microsoft Visual C++ .NET 2003 Standard Edition
Microsoft Visual C++ .NET 2002 Standard Edition

Nó được một lúc kể từ khi tôi phát triển sử dụng ActiveX, nhưng tôi không nhớ phải cài đặt Windows Platform SDK.

+2

Tôi không nghĩ rằng trang đó là chính xác. Trang này chỉ ra rằng mẫu sử dụng ATL và đây là một trong những điều còn thiếu trong phiên bản Visual C++ Express. – Matt