c#调用c++DLL回调函数问题 恩 谢谢iyomumx 我知道是这么做,但是主要怎么定义,什么形式,主要就是这不会写,这个思想我知道 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 委托的定义和导出函数的定义相似,只是使用UnmanagedFunctionPointer特性来调整调用约定和字符集: [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)] delegate void ecmic_onevent ( IntPtr data, int sid, [MarshalAs(UnmanagedType.LPStr)]string evt, [MarshalAs(UnmanagedType.LPStr)]string confno, int mid, [MarshalAs(UnmanagedType.LPStr)]string inviteid, [MarshalAs(UnmanagedType.LPStr)]string caller, [MarshalAs(UnmanagedType.LPStr)]string callee ); [DllImport("libecmic.dll", EntryPoint = "ecmic_setevent", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] void ecmic_setevent(ecmic_onevent evt, IntPtr data);可以考虑定义data为object 谢谢,能在帮我解决一个问题吗,我现在需要把这个封装到C#做的COM里供别的语言调用比如VB,那么我C#该怎么写呢我现在写到这了 [Guid("EA84B01B-BC5C-4B92-999D-3181837778AF"), ClassInterface(ClassInterfaceType.None)] public class Class1 : MyCom_Interface { [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)] delegate void ecmic_onevent ( object data, int sid, [MarshalAs(UnmanagedType.LPStr)]string evt, [MarshalAs(UnmanagedType.LPStr)]string confno, int mid, [MarshalAs(UnmanagedType.LPStr)]string inviteid, [MarshalAs(UnmanagedType.LPStr)]string caller, [MarshalAs(UnmanagedType.LPStr)]string callee ); [DllImport("libecmic.dll", EntryPoint = "ecmic_setevent", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] void ecmic_setevent(ecmic_onevent evt, object data); public void ecmic_setevents(ecmic_onevent evt, object data) { ecmic_setevent(evt, data); }}[Guid("24D52DF9-9426-4887-A849-31B3E5B4BBCE")] public interface MyCom_Interface { [DispId(1)] 这里怎么写呢?}谢谢 如果你的C#代码只是弄个封装,那还不如用C++来写……COM是没有函数指针/委托这种概念的,像VB6就不支持,你需要利用ComSourceInterfaces特性公开一个COM事件 因为对C++不是很熟所以想用C#封装一个COM接口供VB调用,您说的ComSourceInterfaces特性公开一个COM事件,这个是C#的吗,如果是您能教教我吗,如果不是解决方案只有用C++封装?谢谢 C#的com封装完还是需要dotnet的框架才能使用,而且注册也和传统的windows的Com不同。[DispId(1)] string Test_DLLCONN(string Data);你要给其他用户提供什么接口,就定义什么接口。 我已经解决,顺便问一下,拿C#封装的COM,没使用任何控件,如果VB或别的调用客户机上需要安装.netFramework 吗 我好奇怪哦!VB 不是可以直接使用 API 的吗。VB 是可以直接使用普通的 DLL 的导出符号的。 求一条正则表达式 DevExpress求助 C#实现局域网内外用户通信 检验用户名 控件 问题 请问关于TreeView视图节点显示ToolTip的问题? 不存在命名空间名称 怎样得到当前选中列的cell.name 急求VS.NET的帮助文档,高分求购 没有安装.net framwork的机器能运行.net的程序吗? jin 请教Asp.net如何写log 怎么根据行数获取对应的数据表中对应的数据。
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
delegate void ecmic_onevent
(
IntPtr data,
int sid,
[MarshalAs(UnmanagedType.LPStr)]string evt,
[MarshalAs(UnmanagedType.LPStr)]string confno,
int mid,
[MarshalAs(UnmanagedType.LPStr)]string inviteid,
[MarshalAs(UnmanagedType.LPStr)]string caller,
[MarshalAs(UnmanagedType.LPStr)]string callee
);
[DllImport("libecmic.dll", EntryPoint = "ecmic_setevent", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
void ecmic_setevent(ecmic_onevent evt, IntPtr data);
可以考虑定义data为object
public class Class1 : MyCom_Interface
{
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
delegate void ecmic_onevent
(
object data,
int sid,
[MarshalAs(UnmanagedType.LPStr)]string evt,
[MarshalAs(UnmanagedType.LPStr)]string confno,
int mid,
[MarshalAs(UnmanagedType.LPStr)]string inviteid,
[MarshalAs(UnmanagedType.LPStr)]string caller,
[MarshalAs(UnmanagedType.LPStr)]string callee
);
[DllImport("libecmic.dll", EntryPoint = "ecmic_setevent", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
void ecmic_setevent(ecmic_onevent evt, object data);
public void ecmic_setevents(ecmic_onevent evt, object data)
{
ecmic_setevent(evt, data);
}
}[Guid("24D52DF9-9426-4887-A849-31B3E5B4BBCE")]
public interface MyCom_Interface
{
[DispId(1)]
这里怎么写呢?
}谢谢
COM是没有函数指针/委托这种概念的,像VB6就不支持,你需要利用ComSourceInterfaces特性公开一个COM事件
[DispId(1)]
string Test_DLLCONN(string Data);
你要给其他用户提供什么接口,就定义什么接口。
VB 不是可以直接使用 API 的吗。
VB 是可以直接使用普通的 DLL 的导出符号的。