Здравейте дот-нетаджии
Първо искам да се извиня за дългият постинг - има парчета код както и доста описания...
Имам си един дребен проблем, който обаче вече ми бърка някъде та се не трае... Искам контрол (UserControl) написан на .NET (.NET 2.0) да го interop-на до ActiveX за да може СОМ-клиент нормално да го ползва. Проблема е, че известните класови атрибути за interop-ване не генерират необходимите IDL/ODL атрибути в типовата библиотека (липсваt control и object атрибутите) и в крайна сметка regasm регистрира само interop-натите интерфейси без да каже, че те са едно цяло като ActiveX контрол. В следствие на това тоя .NET контрол се вижда само като такъв но не и като ActiveX. Отделните му интерфейси обаче са видими като Automation-интерфейси. Под отделни интерфейси имам предвид интерфейса на класа на контрола и диспач-интерфейса на ивентите.
Една забележка за парчетата код по-долу: ГУИД-етата са сменени от мен при пействането на кода тук, иначе си имат съвсем нормални и валидни стойности.
Ето част от декларацията на контрола...
public delegate void UserInteractionHandler();
public delegate void UserCommandHandler(string sCommand, long iCode);
[GuidAttribute("xxxxxxxx-yyyy-zzzz-0000-123456789012")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public interface SimpleUserControlServiceEvents
{
void UserInteraction();
void UserCommand(string sCommand, int iCode);
}
[ClassInterfaceAttribute(ClassInterfaceType.AutoDual)]
[AutomationProxyAttribute(true)]
[IDispatchImplAttribute(IDispatchImplType.InternalImpl)]
[ComSourceInterfacesAttribute("COMSimpleService.SimpleUserControlServiceEvents, COMLibrary")]
public class SimpleUserControlService : System.Windows.Forms.UserControl
{
public event UserInteractionHandler UserInteraction;
public event UserCommandHandler UserCommand;
......
А ето това е което се получава в тип-библиотеката след експорта и регистрацията...
[
uuid(xxxxxxxx-yyyy-zzzz-0000-123456789012),
version(1.0),
noncreatable,
custom({xxxxxxxx-yyyy-zzzz-0000-123456789012}, "COMSimpleService.UserInteractionHandler")
]
coclass UserInteractionHandler {
[default] interface _UserInteractionHandler;
interface _Delegate;
interface _Object;
interface ICloneable;
interface ISerializable;
};
[
uuid(xxxxxxxx-yyyy-zzzz-0000-123456789012),
version(1.0),
noncreatable,
custom({xxxxxxxx-yyyy-zzzz-0000-123456789012}, "COMSimpleService.UserCommandHandler")
]
coclass UserCommandHandler {
[default] interface _UserCommandHandler;
interface _Delegate;
interface _Object;
interface ICloneable;
interface ISerializable;
};
[
uuid(xxxxxxxx-yyyy-zzzz-0000-123456789012),
version(1.0),
custom({xxxxxxxx-yyyy-zzzz-0000-123456789012}, "COMSimpleService.SimpleUserControlServiceEvents")
]
dispinterface SimpleUserControlServiceEvents {
properties:
methods:
[id(0x60020000)]
void UserInteraction();
[id(0x60020001)]
void UserCommand(
[in] BSTR sCommand,
[in] long iCode);
};
[
uuid(xxxxxxxx-yyyy-zzzz-0000-123456789012),
version(1.0),
custom({xxxxxxxx-yyyy-zzzz-0000-123456789012}, "COMSimpleService.SimpleUserControlService")
]
coclass SimpleUserControlService {
[default] interface _SimpleUserControlService;
interface _Object;
interface IComponent;
interface IDisposable;
interface IPersist;
[default, source] dispinterface SimpleUserControlServiceEvents;
};
[
odl,
uuid(xxxxxxxx-yyyy-zzzz-0000-123456789012),
hidden,
dual,
oleautomation,
custom({xxxxxxxx-yyyy-zzzz-0000-123456789012}, "COMSimpleService.UserInteractionHandler")
]
interface _UserInteractionHandler : IDispatch {
};
[
odl,
uuid(xxxxxxxx-yyyy-zzzz-0000-123456789012),
hidden,
dual,
oleautomation,
custom({xxxxxxxx-yyyy-zzzz-0000-123456789012}, "COMSimpleService.UserCommandHandler")
]
interface _UserCommandHandler : IDispatch {
};
[
odl,
uuid(xxxxxxxx-yyyy-zzzz-0000-123456789012),
hidden,
dual,
nonextensible,
oleautomation,
custom({xxxxxxxx-yyyy-zzzz-0000-123456789012}, "COMSimpleService.SimpleUserControlService")
]
interface _SimpleUserControlService : IDispatch {
// ... тука са една тълпа пропертита и методи включени
// ... от самият базов клас UserControl
[id(0x60020129)]
HRESULT NotifyClient([in] long fWhichEvent);
[id(0x6002012a), propget]
HRESULT Command([out, retval] BSTR* pRetVal);
[id(0x6002012a), propput]
HRESULT Command([in] BSTR pRetVal);
[id(0x6002012c), propget]
HRESULT EnableUI([out, retval] long* pRetVal);
[id(0x6002012c), propput]
HRESULT EnableUI([in] long pRetVal);
};
Ще бъда много благодарен на всеки, който ми даде смислено, не-заяждащо се мнение, както разбира се и на всеки, който ми помогне с идея, линк, подсказка и т.н.
Мерси ви предварително.
Умри де ел'Ориго, слуга на капитана!
|