项目中,业务要求实现一个这样功能, VB6.0程序引用一个C#做成的DLL程序, 初期化时VB6.0把自己的一个方法注册到C#程序中, 在某种条件下,触发事件在C#程序中,再回调VB6.0传进来的方法.
回调的处理已经实现了,但参数传递问题如何解决,VB6。0传递的是方法地址指针.C#程序:
namespace ApIfVb
{
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void CallBackFunction(String strVal); [InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("45BD35F5-ADC6-4e87-B68C-4AF9DEC464D1")]
public interface IApIfAccess
{
[DispId(1)]
String AttachToVBEventMethod(int address);
} [Guid("C1AAE61C-CE78-4b53-909D-98CE668647B2"), ClassInterface(ClassInterfaceType.None)]
public class ApIfAccess : MarshalByRefObject,IApIfAccess
{
//事件委託
public static Delegate onEventChange = null; public static CallBackFunction callBackFun = null; /// <summary>
/// VB初期化処理
/// </summary>
/// <param name="address">事件指針</param>
public String AttachToVBEventMethod(int address)
{
CallBackFunction1 callback = (CallBackFunction1)Marshal.GetDelegateForFunctionPointer(
new IntPtr(address), typeof(CallBackFunction1));
SetCallbackMethod(callback);
callBackFun1 = callback; if (ApIfAccess.onEventChange != null)
{
Object[] obj = { "Send" };
onEventChange.DynamicInvoke(obj);
} return "VB ServerStart!!!";
}
private void SetCallbackMethod([MarshalAs(UnmanagedType.FunctionPtr)]
CallBackFunction callback)
{
onEventChange = callback;
}
}VB6.0程序:
建立一个WINFROM程序,并且通过COM引用C#[ApIfVb]DLL程序:
Dim comAccesss As New ApIfVb.ApIfAccess
Private Sub Form_Load()
Text1.Text = comAccesss.AttachToVBEventMethod(AddressOf VbRollBack)
End Sub
再建立一个Module1:
Public Sub VbRollBack(ByVal strVal As String)
Form1.Text2.Text = Form1.Text2.Text + strVal + "AddVBThred "
End Sub执行的时候VB端会出现异常,
'-2147467261'(80004003)',提示被保护的参数,禁止被读取。以上,请各路大侠帮忙看看,如何解决VB6。0回调传参数的问题,谢谢了!!!
回调的处理已经实现了,但参数传递问题如何解决,VB6。0传递的是方法地址指针.C#程序:
namespace ApIfVb
{
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void CallBackFunction(String strVal); [InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("45BD35F5-ADC6-4e87-B68C-4AF9DEC464D1")]
public interface IApIfAccess
{
[DispId(1)]
String AttachToVBEventMethod(int address);
} [Guid("C1AAE61C-CE78-4b53-909D-98CE668647B2"), ClassInterface(ClassInterfaceType.None)]
public class ApIfAccess : MarshalByRefObject,IApIfAccess
{
//事件委託
public static Delegate onEventChange = null; public static CallBackFunction callBackFun = null; /// <summary>
/// VB初期化処理
/// </summary>
/// <param name="address">事件指針</param>
public String AttachToVBEventMethod(int address)
{
CallBackFunction1 callback = (CallBackFunction1)Marshal.GetDelegateForFunctionPointer(
new IntPtr(address), typeof(CallBackFunction1));
SetCallbackMethod(callback);
callBackFun1 = callback; if (ApIfAccess.onEventChange != null)
{
Object[] obj = { "Send" };
onEventChange.DynamicInvoke(obj);
} return "VB ServerStart!!!";
}
private void SetCallbackMethod([MarshalAs(UnmanagedType.FunctionPtr)]
CallBackFunction callback)
{
onEventChange = callback;
}
}VB6.0程序:
建立一个WINFROM程序,并且通过COM引用C#[ApIfVb]DLL程序:
Dim comAccesss As New ApIfVb.ApIfAccess
Private Sub Form_Load()
Text1.Text = comAccesss.AttachToVBEventMethod(AddressOf VbRollBack)
End Sub
再建立一个Module1:
Public Sub VbRollBack(ByVal strVal As String)
Form1.Text2.Text = Form1.Text2.Text + strVal + "AddVBThred "
End Sub执行的时候VB端会出现异常,
'-2147467261'(80004003)',提示被保护的参数,禁止被读取。以上,请各路大侠帮忙看看,如何解决VB6。0回调传参数的问题,谢谢了!!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货