17,747
社区成员




namespace WPFCom
{
/// <summary>
/// Function interface
/// </summary>
// To make the interface visible in COM client
[ComVisible(true),
// To set guid
GuidAttribute("8DD32EFF-A446-4cb6-B6F9-0E48AD3E1A69"),
// To set the interface type
InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IShowWin
{
[DispId(1)]
void ShowWin();
}
/// <summary>
/// Event interface
/// </summary>
[Guid("CB249F50-7649-4a91-BB99-BF189187E58A"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch),
ComVisible(true)]
public interface IButtonEvent
{
[DispId(1)]
void ButtonClick();
[DispId(2)]
void WindowClosed();
[DispId(3)]
double WindVoid(double p, double p1);
}
/// <summary>
/// delegate for event
/// </summary>
/// <param name="p">
/// message string.
/// </param>
public delegate void ComEvent();
public delegate double ComEventvoid(double p, double p1);
// Com class
[ComVisible(true),
GuidAttribute("36CC3A95-7430-4a3c-8D89-45C6671A2BFB"),
// To set ICOMROTVictimEvents interface as event source.
ComSourceInterfaces(typeof(IButtonEvent)),
// No public memeber should be exposed.
ClassInterface(ClassInterfaceType.None)]
public class WPFWin : IShowWin
{
/// <summary>
/// A button clicked in WPF windows
/// </summary>
public event ComEvent ButtonClick;
public event ComEvent WindowClosed;
public event ComEventvoid WindVoid;
/// <summary>
/// A default constructor
/// </summary>
public WPFWin()
{
m_win = new CompileXamlWindow();
m_win.ButtonClick += OnButtonClick;
m_win.Closed += OnWindowClosed;
}
/**/
unsafe private void OnWindowClosed(object sender, EventArgs e)
{
if (WindowClosed != null)
{
try
{
WindowClosed();//调用C++,此处不报异常,但不能进入C++代码
}
catch (System.Exception ms)
{
MessageBox.Show(ms.Message);
}
}
}
/// <summary>
/// TO show the window.
/// </summary>
public void ShowWin()
{
m_win.Show();
}
unsafe private void OnButtonClick()
{
if (WindVoid != null)
{
try
{
ButtonClick();//调用C++,此处不报异常,但不能进入C++代码
double param = 1;
double param1 = 2;
WindVoid(param, param1);//调用C++,此处报异常:ByRef value type parameter cannot be null
}
catch (System.Exception ms)
{
MessageBox.Show(ms.Message);
}
}
}
private CompileXamlWindow m_win;
}
}
class CCOMROTVictimWrapper :
public IDispEventImpl<0, CCOMROTVictimWrapper, &__uuidof(IButtonEvent), &__uuidof(WPFComLib), 1, 0>
{
public:
CCOMROTVictimWrapper(void);
virtual ~CCOMROTVictimWrapper(void);
BEGIN_SINK_MAP(CCOMROTVictimWrapper)
SINK_ENTRY_EX(0, __uuidof(IButtonEvent), 1, OnWPFButtonClick)
SINK_ENTRY_EX(0, __uuidof(IButtonEvent), 2, OnWindowClosed)
SINK_ENTRY_EX(0, __uuidof(IButtonEvent), 3, WindVoid)
END_SINK_MAP()
// incoming calls from the C# app
STDMETHOD_(void, OnWPFButtonClick)(BSTR param);
STDMETHOD_(void, OnWindowClosed)(BSTR param);
STDMETHOD_(double, WindVoid)(double param,double param);
}
void CCOMROTVictimWrapper::OnWPFButtonClick(BSTR str)
{
AfxMessageBox("CSharpCallsMfc param: " + CString(str));
}
void CCOMROTVictimWrapper::OnWindowClosed(BSTR str)
{
AfxMessageBox("CSharpCallsMfc param: " + CString(str));
}
double CCOMROTVictimWrapper::WindVoid(double param,double param)
{
AfxMessageBox("CSharpCallsMfc param: ");
}