zoukankan      html  css  js  c++  java
  • C# 调用第三方DLL完整实例

    C# 调用第三方DLL完整实例

    分类: C/C++

    以下代码为本人在实际项目中编写的调用第三方DLL接口程序的完整代码。

    public class ExecuteDLL : Form

    {

       ...//忽略与调用DLL无关的代码

       private IntPtr hModule = IntPtr.Zero;

       /// <summary>

       /// 调用HIS系统提供的DLL接口程序查看检查申请单

       ///DLL的名称:H62AppQueryToPacs.dll

       ///函数名说明:

       ///function THandle HLoginProc(THandlea AppHandle, THandle aCallWinHandle,THandle aPluginHandle

       ///                            PChar aBqno,PChar aEmpno,PChar aPatno);

       ///传入变量参数说明:

       /////    aAppHandle: THandle; //应用程序句柄

       /////    aCallWinHandle: THandle; //调用窗口句柄

       /////    aPluginHandle: THandle; // 插件的句柄

       /////    aEmpno,PChar;//医生工号

       /////    aBqno: PChar;//病区代码

       /////    aPatno: PChar;//病人记账号

       /// </summary>

       /// <param name="lpFileName"></param>

       /// <returns></returns> 

       //申明外部API

       [DllImport("kernel32.dll")]

       static extern IntPtr LoadLibrary(string lpFileName);

       [DllImport("kernel32.dll")]

       static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);

       [DllImport("kernel32", EntryPoint = "FreeLibrary", SetLastError = true)]

       static extern bool FreeLibrary(IntPtr hModule);

       //申明委托

       private delegate IntPtr HLoginProc(IntPtr aAppHandle,  IntPtr aCallWinHandle,  IntPtr aPluginHandle,

             string aBqno, string aEmpno,  string aPatno);

       //获取函数地址

       private Delegate GetFunctionAddress(IntPtr dllModule, string functionName, Type t)

       {

           IntPtr address = GetProcAddress(dllModule, functionName);

           if (address == IntPtr.Zero)

               return null;

           else

               return Marshal.GetDelegateForFunctionPointer(address, t);

       }

       //按钮单击事件

       private void button_CheckList_Click(object sender, EventArgs e)

       {

           try

           {

               SIS_Model.MWorkList smWorkList;

               PACS_Model.MWorkList pmWorkList;

               string strNo = "";

               switch (GetConfig.DALAndModel)

               {

                   case "SIS":

                       smWorkList = (SIS_Model.MWorkList)this.iWorkList;

                       strNo = (smWorkList.INPATIENTNO == null ? "" : smWorkList.INPATIENTNO.ToString());// 病人记账号 "875624";

                       break;

                   case "PACS":

                       pmWorkList = (PACS_Model.MWorkList)this.iWorkList;

                       strNo = (pmWorkList.INPATIENTNO == null ? "" : pmWorkList.INPATIENTNO.ToString());// 病人记账号 "875624";

                       break;

               }

               if (strNo.Trim() == "")

               {

                   MessageBox.Show("无法获取患者ID,请确认操作步骤是否正确");

                   return;

               }

               //加载DLL

               try

               {

                   string strDLLPath = Environment.CurrentDirectory + "\HuiTong\JianChaShenQingDan\H62AppQueryToPacs.dll";

                   hModule = LoadLibrary(strDLLPath);

                   if (hModule.Equals(IntPtr.Zero))

                   {

                       MessageBox.Show("导入DLL失败");

                       return;

                   }

               }

               catch (Exception ex)

               {

                   MessageBox.Show(ex.Message.ToString());

                   FreeLibrary(hModule);

                   hModule = IntPtr.Zero;

                   return;

               }

               //将要调用的方法转换为委托:hModule为DLL的句柄,"HLoginProc"为DLL中方法的名称

               HLoginProc farProc = (HLoginProc)this.GetFunctionAddress(hModule, "HLoginProc", typeof(HLoginProc));

               if (farProc == null)

               {

                   FreeLibrary(hModule);

                   hModule = IntPtr.Zero;

                   return;

               }

               //利用委托执行DLL文件中的接口方法

               farProc(hModule, IntPtr.Zero, IntPtr.Zero, null, null, strNo);

               FreeLibrary(hModule);

               hModule = IntPtr.Zero;

           }

           catch (Exception ex)

           {

               MessageBox.Show(ex.Message.ToString());

               FreeLibrary(hModule);

               hModule = IntPtr.Zero;

               return;

           }

       }

    }

    版权申明:

    此文为作者原创,转载请提供原始文章链接,谢谢!

  • 相关阅读:
    论文解析 -- TiDB: A Raftbased HTAP Database
    人生资产负债表
    Hadoop、Hive、Spark 之间关系
    在 Python3 中,bytes 和 str 的互相转换方式是
    json中load和loads区别
    springboot——修改html实时生效,不用重启tomca(idea版)
    ThinkPHP6 利用crontab+think make:command执行定时任务 tp6默认不可以用命令行访问控制器
    Whoops, GitLab is taking too much time to respond.解决
    phpmyadmin导入csv文件 #1366
    pipenv --python 'python/path' install 报错原因
  • 原文地址:https://www.cnblogs.com/sczw-maqing/p/3319689.html
Copyright © 2011-2022 走看看