Chinaunix首页 | 论坛 | 博客
  • 博客访问: 521739
  • 博文数量: 60
  • 博客积分: 1445
  • 博客等级: 上尉
  • 技术积分: 507
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-14 19:15
文章分类

全部博文(60)

文章存档

2012年(1)

2011年(7)

2010年(52)

我的朋友

分类: C/C++

2010-07-01 16:29:23

以下代码为本人在实际项目中编写的调用第三方DLL接口程序的完整代码。
public class ExecuteDLL : Form 
{
   ...//忽略与调用DLL无关的代码
   private IntPtr hModule = IntPtr.Zero;
   ///
   /// 调用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;//病人记账号 
   ///
   ///
   ///  
   
   //申明外部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;
       }
   }
}

版权申明:
此文为作者原创,转载请提供原始文章链接,谢谢!
阅读(35041) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~