http://blog.163.com/da7_1@126/blog/static/104072678201311721326318/
以下代码为本人在实际项目中编写的调用第三方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;
       }
   }
}

最新文章

  1. 浅谈web网站架构演变过程
  2. FORM中需要反复选择LOV
  3. 更改项目名或者多个项目时,发现多个&quot;Home&quot;匹配的Controller时,解决方法
  4. ViewPager
  5. JAVA 十六进制与字符串的转换
  6. check the element in the array occurs more than half of the array length
  7. TortoiseSVN客户端如何更改新的URL
  8. linux命令别名的使用
  9. SGU 149. Computer Network( 树形dp )
  10. [CLR via C#]5.4 对象哈希码和dynamic基元类型
  11. 【转】25个Git用法技巧
  12. 创建 OVS vlan101 并部署 instance - 每天5分钟玩转 OpenStack(139)
  13. 刨根究底字符编码之十三——UTF-16编码方式
  14. Zabbix(一) : 简介以及Server端安装
  15. JavaScript中的高阶函数
  16. 使用Notepad++开发Java程序
  17. 洛谷P1379 八数码难题
  18. Get与Post的主要区别
  19. Xcode 清理存储空间
  20. 面试题----makefile文件的作用

热门文章

  1. Trailing Loves (or L'oeufs?)
  2. hdu1686 Oulipo kmp
  3. Spark (Python版) 零基础学习笔记(一)—— 快速入门
  4. h5 的video视频控件
  5. PIE SDK ISODATA分类
  6. element-ui日期组件DatePicker设置日期选择范围Picker Options
  7. 转 UTL_FILE Throws ORA-29284 Or ORA-29283 When Attempting To READ File
  8. rancher2.X搭建k8s集群平台
  9. 详解http之post
  10. pulic——function(下载的公共的)