C# 调用VC++写的dll 回调机制如何实现 江湖救急

shamohai5566 2011-08-03 10:52:12
大家好,我用的是VS2010 C#,dll以前没有调过,现在我要调一个c++写的dll,项目是上位机与下位机通信方面的,dll基本上要实现的功能就是:1.我将部分数据传给dll,dll解析并显示数据。2.dll回调我的C#主程序,将dll要发给下位机的命令数据传给C#主程序,C#主程序发给下位机。目前,功能1已经实现,到了功能2,由于搞不懂C#中dll的回调机制是如何实现的,查了好多资料,也没能解决问题,望大家帮忙,先行谢过。最好是带上实例。
我功能1的代码
 
[DllImport("StaticDll.dll", CharSet = CharSet.Ansi, EntryPoint = "CreateDlgEx", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int CreateDlgEx(int na);
[DllImport("StaticDll.dll", CharSet = CharSet.Ansi, EntryPoint = "AcceptDataEx", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int AcceptDataEx(byte[] sBuf, int nLen, int nType);

现在功能2 想提供一个带有两个参数的 回调函数 参数1 byte[] btData,参数2 int nLen,供DLL调用,请指点
...全文
76 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdl2005lyx 2011-08-04
  • 打赏
  • 举报
回复
回调函数是托管应用程序中可帮助非托管 DLL 函数完成任务的代码。对回调函数的调用将从托管应用程序中,通过一个 DLL 函数,间接地传递给托管实现。在用平台调用调用的多种 DLL 函数中,有些函数要求正确地运行托管代码中的回调函数。

开始实现之前,先查看 EnumWindows 函数的签名。EnumWindows 具有以下签名:

复制代码
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)


表示此函数需要回调的线索之一是存在 lpEnumFunc 参数。如果参数采用指向回调函数的指针,其名称中通常会有 lp(长指针)前缀与 Func 后缀的组合。有关 Win32 函数的文档,请参见 Microsoft Platform SDK。

创建托管回调函数。该示例声明一个名为 CallBack 的委托类型,此委托类型采用两个参数:hwnd 和 lparam。第一个参数是窗口的句柄;第二个参数由应用程序定义。在此版本中,这两个参数都必须是整数。

回调函数通常会返回非零值来表示成功,返回零来表示失败。本示例将返回值显式设置为 true,以继续进行枚举。

创建一个委托,并将其作为参数传递给 EnumWindows 函数。平台调用会自动将委托转换为常见的回调格式。

isjoe 2011-08-04
  • 打赏
  • 举报
回复
非托管回调示例

[DllImport("user32")]

public static extern int EnumWindows(CallBack x, int y);

3.最后实例化委托,调用 EnumWindows。

CallBack myCallBack = new CallBack(EnumWindowsApp.Report);

4.完全代码如下:

using System;

using System.Runtime.InteropServices;

public delegate bool CallBack(int hwnd, int lParam);

public class EnumWindowsApp

{

[DllImport("user32")]

public static extern int EnumWindows(CallBack x, int y);

public static void Main()

{

CallBack myCallBack = new CallBack(EnumWindowsApp.Report);

EnumWindows(myCallBack, 0);

}

public static bool Report(int hwnd, int lParam)

{

Console.Write("Window handle is :");

Console.WriteLine(hwnd);

return true;

}

}

shamohai5566 2011-08-04
  • 打赏
  • 举报
回复
dataArrive = new TXYS_DataArriveHandler_t(this.fDataArriveHandler);
TXYS_RegDataArriveEventHandler(dataArrive);//注册回调函数

上面代码补充 大家请帮忙
feng9330 2011-08-04
  • 打赏
  • 举报
回复
MARK
shamohai5566 2011-08-04
  • 打赏
  • 举报
回复
谢谢 大家 那个问题已经解决了 现在双向都能调用,只是参数方面出现新的问题。DLL中有一个byte指针类型的参数,还有一个长度,目的是把命令数据传给C#主程序,C#主程序这边 收到参数长度 正确,数组为空
public static extern void TXYS_RegDataArriveEventHandler(TXYS_DataArriveHandler_t fHandlerFunc);   //注册数据到来 

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void TXYS_DataArriveHandler_t(ref byte sBuf, int nLen, int nType);

TXYS_DataArriveHandler_t dataArrive;
public void fDataArriveHandler(ref byte btData1 , int nLen, int nType)
{
byte [] btData=new byte [nLen];
Marshal.Copy(btData1, btData, 0, nLen);
}
这是回调函数声明及定义部分 高手请指点 谢谢
Jxiaoshen 2011-08-03
  • 打赏
  • 举报
回复
顶顶~~ 坐等大虾

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧