新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → C#中调用DLL 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4174 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: C#中调用DLL 举报  打印  推荐  IE收藏夹 
       本主题类别: Description Logics    
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 C#中调用DLL

    首先必须要有一个声明,使用的是DllImport关键字:
    包含DllImport所在的名字空间
    using System.Runtime.InteropServices;
    public class XXXX{

    [DllImport(“MyDLL.dll ")]
    public static extern int mySum (int a,int b);
    }

    [DllImport(“MyDLL.dll ")]
    public static extern int mySum (int a,int b);
    代码中DllImport关键字作用是告诉编译器入口点在哪里,并将打包函数捆绑在这个类中
    在调用的时候
    在类中的时候 直接  mySum(a,b);就可以了
    在其他类中调用: XXXX. mySum(a,b);

    [DllImport(“MyDLL.dll”)]在申明的时候还可以添加几个属性
    [DllImport(“MyDLL.dll ", EntryPoint= " mySum ",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)
    ]
    EntryPoint: 指定要调用的 DLL 入口点。默认入口点名称是托管方法的名称 。
    CharSet: 控制名称重整和封送 String 参数的方式 (默认是UNICODE)
    CallingConvention指示入口点的函数调用约定(默认WINAPI)(上次报告讲过的)
    SetLastError 指示被调用方在从属性化方法返回之前是否调用 SetLastError Win32 API 函数 (C#中默认false )


    int 类型
    [DllImport(“MyDLL.dll ")]
    //返回个int 类型
    public static extern int mySum (int a1,int b1);
    //DLL中申明
    extern “C” __declspec(dllexport) int WINAPI mySum(int a2,int b2)
    {
    //a2 b2不能改变a1 b1
    //a2=..
    //b2=...
    return a+b;
    }


    //参数传递int 类型
    public static extern int mySum (ref int a1,ref int b1);
    //DLL中申明
    extern “C” __declspec(dllexport) int WINAPI mySum(int *a2,int *b2)
    {
    //可以改变 a1, b1
    *a2=...
    *b2=...
    return a+b;
    }


    DLL 需传入char *类型
    [DllImport(“MyDLL.dll ")]
    //传入值
    public static extern int mySum (string astr1,string bstr1);
    //DLL中申明
    extern “C” __declspec(dllexport) int WINAPI mySum(char * astr2,char * bstr2)
    {
    //改变astr2 bstr 2 ,astr1 bstr1不会被改变
    return a+b;
    }


    DLL 需传出char *类型
    [DllImport(“MyDLL.dll ")]
    // 传出值
    public static extern int mySum (StringBuilder abuf, StringBuilder bbuf );
    //DLL中申明
    extern “C” __declspec(dllexport) int WINAPI mySum(char * astr,char * bstr)
    {
    //传出char * 改变astr bstr --> abuf, bbuf可以被改变
    return a+b;
    }

    DLL 回调函数

    BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)


    using System;
    using System.Runtime.InteropServices;
    public delegate bool CallBack(int hwnd, int lParam); //定义委托函数类型
    public class EnumReportApp
    {
    [DllImport( "user32 ")]
    public static extern int EnumWindows(CallBack x, int y);
    public static void Main() {
    CallBack myCallBack = new CallBack(EnumReportApp.Report); EnumWindows(myCallBack, 0);
    }
    public static bool Report(int hwnd, int lParam)
    {
    Console.Write( "Window handle is ");
    Console.WriteLine(hwnd); return true;
    }
    }


    DLL 传递结构
    BOOL PtInRect(const RECT *lprc, POINT pt);

    using System.Runtime.InteropServices;
    [StructLayout(LayoutKind.Sequential)]
    public struct Point {
    public int x;
    public int y;
    }
    [StructLayout(LayoutKind.Explicit)]
    public struct Rect
    {
    [FieldOffset(0)] public int left;
    [FieldOffset(4)] public int top;
    [FieldOffset(8)] public int right;
    [FieldOffset(12)] public int bottom;
    }
    Class XXXX {
    [DllImport( "User32.dll ")]
    public static extern bool PtInRect(ref Rect r, Point p);
    }


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;


    namespace ClientControl
    {
    public partial class MainForm : Form
    {
    [DllImport( "bmpcodec.dll ")]
    static extern int TXYS_InitSystem();//初始化
    [DllImport( "bmpcodec.dll ")]
    static extern int TXYS_ExitSystem();//退出
    [DllImport( "bmpcodec.dll ")]
    static extern int TXYS_StartRecvBMP();//开始压缩图像
    [DllImport( "bmpcodec.dll ")]
    static extern int TXYS_StopRecvBMP();//停止压缩图像
    [DllImport( "bmpcodec.dll ")]
    static extern int TXYS_CheckNetChannel(int iAllowBandWidth); //网络信道检测
    [DllImport( "bmpcodec.dll ")]
    static extern int TXYS_RegDataArriveEventHandler(TXYS_DataArriveHandler_t fHandlerFunc); //注册数据到来
    [DllImport( "bmpcodec.dll ")]
    static extern int TXYS_RegReqTimeEventHandler(TXYS_RequestTimeHandler_t fHandlerFunc); //注册时间
    [DllImport( "bmpcodec.dll ")]
    static extern int TXYS_RegWarnEventHandler(TXYS_WarnHandler_t fHandlerFunc); //注册警告
    [DllImport( "bmpcodec.dll ")]
    static extern int TXYS_RegStateNotifyEventHandler(TXYS_StateNotifyHandler_t fHandlerFunc);//注册状态

    // 函数指针类型
    public delegate int TXYS_DataArriveHandler_t(long iImageFrameNo, int iPackNo, int iDataSize, char[] ucData);
    public delegate int TXYS_RequestTimeHandler_t();
    public delegate int TXYS_WarnHandler_t(int iFaultNo, int iWarnType);
    public delegate int TXYS_StateNotifyHandler_t(long lStartTime, long lEndTime,
    long lMinDelayTime, long lMaxDelayTime, long lMeanDelayTime,
    int iMaxLostFarmeNum, int iTotalLostFrameNum);
    private delegate void UpdateDelegate(string str);
    //委托操作函数
    private void UpdateText(string str)
    {
    datalabel.Text=str;
    }
    TXYS_DataArriveHandler_t dataArrive;//=new TXYS_DataArriveHandler_t(
    //回调函数
    public int fDataArriveHandler(long iImageFrameNo, int iPackNo, int iDataSize, char[] ucData)
    {
     UpdateDelegate eh = new UpdateDelegate(UpdateText);
    this.datalabel.Invoke(eh, new object[] {iImageFrameNo + " "+iPackNo+ "帧数据到来 " });
    datalabel.Text = " " + iImageFrameNo + "帧数据到来 ";

    return 0;
    }
    public MainForm()
    {
    InitializeComponent();
    TXYS_InitSystem();
    dataArrive = new TXYS_DataArriveHandler_t(this.fDataArriveHandler);
    TXYS_RegDataArriveEventHandler(dataArrive);//注册回调函数
    }
    ~MainForm()
    {

    //TXYS_ExitSystem();
    }

    private void MainForm_Load(object sender, EventArgs e)
    {

    }
    //启动图像传输
    private void ButtonStart_Click(object sender, EventArgs e)
    {
    TXYS_StartRecvBMP();
    }

    private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
    {
    TXYS_ExitSystem();
    }

    private void buttonStop_Click(object sender, EventArgs e)
    {
    TXYS_StopRecvBMP();
    }
    }
    }


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/7/10 16:02:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/12/27 2:19:01

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    2,935.547ms