三种语言对Delphi的dll的调用

   近来因为工作的原因,需要写一个Delphi的dll供他人调用,于是写了几个例子,供大家参考。

1 。Delphi 的dll: Barcode.dll

library Barcode;



uses
  SysUtils,
  Forms,
  Windows,
  Messages,
  Classes,
  HisInterfaceDataModUnit 
in 'HisInterfaceDataModUnit.pas' {HisInterfaceDataModule: TDataModule};
  //myRapFuncs 
in 'myRapFuncs.pas';

{$R *.res}
procedure PrintBarcode(Barcode,PatNo,PatName,SickBed,ItemStr,Sample:PChar);stdcall;
//注意如果传入字符串类型的参数要用:
PChar
begin
    
if not Assigned(HisInterfaceDataModule) then
     HisInterfaceDataModule:
=THisInterfaceDataModule.Create(nil);
  FBarcode:
=Barcode;
  FPatNo:
=PatNo;
  FPatName:
=PatName;
  FSickBed:
=SickBed;
  FItemStr:
=ItemStr;
  FSample:
=Sample;
  HisInterfaceDataModule.Print;
end;
exports
  PrintBarcode;
begin

end.

HisInterfaceDataModUnit.pas:
unit HisInterfaceDataModUnit;

interface

uses
  SysUtils, Classes,  ppBarCode2D, ppPrnabl, ppClass, ppCtrls, ppBarCod, ppBands,
  ppCache, ppComm, ppRelatv, ppProd, ppReport,myRapFuncs, ppModule,
  raCodMod, ppStrtch, ppMemo, ppParameter, ppRichTx,Inifiles;

type
  THisInterfaceDataModule 
= class(TDataModule)
    ppReport1: TppReport;
    ppParameterList1: TppParameterList;
    ppHeaderBand1: TppHeaderBand;
    ppDetailBand1: TppDetailBand;
    ppBarCode1: TppBarCode;
    PaNameLabel: TppLabel;
    PatNoLabel: TppLabel;
    SickbedLabel: TppLabel;
    SampleLabel: TppLabel;
    SampleLabel1: TppLabel;
    PatNoLabel1: TppLabel;
    ppBarCode2: TppBarCode;
    PaNameLabel1: TppLabel;
    SickbedLabel1: TppLabel;
    ppMemo1: TppMemo;
    ppMemo2: TppMemo;
    ppFooterBand1: TppFooterBand;
    raCodeModule1: TraCodeModule;


  
private

    function AddZeroToStr(S:
string;Zero:Integer):String;
    function GetIniStr(Section,Ident:
string): string;
    
{ Private declarations }
  
public

   procedure Print;

    
{ Public declarations }
  end;

var
  HisInterfaceDataModule: THisInterfaceDataModule;
  FBarcode,FPatNo,FPatName,FSickBed,FItemStr,FSample:
string;

implementation

uses Variants;

{$R *.dfm}
{ THisInterfaceDataModule }

function THisInterfaceDataModule.AddZeroToStr(S:
string;Zero:Integer):String;
var
  L:Integer;
  tempStr:String;
begin
  tempStr:
=S;
  L:
=Length(Trim(tempStr));
  
while L<Zero do
  begin
    Insert(
'0',tempStr,1);
    L:
=Length(Trim(tempStr));
  end;
  Result:
=tempStr;
end;
Function THisInterfaceDataModule.GetIniStr(Section,Ident:
string):string;
var
 MyFile:TiniFile;
 S:String;
begin
  MyFile:
=TIniFile.Create('c:arcode.ini');
  S:
='';
  
if myfile.ValueExists(Pchar(Section),Pchar(Ident)) then
  S:
=myfile.ReadString(Pchar(Section),Pchar(Ident),'');
  MyFile.Free;
  rESULT:
=S;
end;

procedure THisInterfaceDataModule.Print;
var
  i:Integer;
  myPrinterName,myDeviceType:
string;
begin
  ppBarCode1.Data:
=FBarcode;
  ppBarCode2.Data:
=FBarcode;
  PatNoLabel.Caption :
=FPatNo;
  PaNameLabel.Caption:
=FPatName;
  SickbedLabel.Caption:
=FSickBed;
  SampleLabel.Caption:
=FSample;
  ppMemo1 .Text:
=FItemStr;


  PatNoLabel1.Caption :
=FPatNo;
  PaNameLabel1.Caption:
=FPatName;
  SickbedLabel1.Caption:
=FSickBed;
  SampleLabel1.Caption:
=FSample;

  ppMemo2 .Text:
=FItemStr;

  myDeviceType:
=GetIniStr('ReportSetup','DeviceType');

  
if  myDeviceType='Printer' then   ppReport1.DeviceType:='Printer' else ppReport1.DeviceType:='Screen';

  myPrinterName:
='';
  i:
=StrToIntDef(GetIniStr('PrinterSetup','PrinterIndex'),0);
  
if ppReport1.PrinterSetup.PrinterNames.Count>=i then
  myPrinterName:
=ppReport1.PrinterSetup.PrinterNames[i];
  
if  myPrinterName<>'' then
  ppReport1.PrinterSetup.PrinterName:
=myPrinterName;

  ppReport1.PrintToDevices;
  ppReport1.PrintReport;

end;
end.

 用Delphi调用的例子:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, Grids, DBGrids, DBClient, MConnect, SConnect,
  ADODB, Provider;

type
  TForm1 
= class(TForm)
    Button6: TButton;
    Button1: TButton;

    procedure Button6Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  
private

    procedure Print2(Barcode,PatNo,PatName,SickBed,ItemStr,Sample:
string);

    
{ Private declarations }
  
public
    
{ Public declarations }
  end;

var
  Form1: TForm1;


  
///// DLL文件:Barcode.dll
  
///// 函数名 PrintBarcode

 // 参数依次为
  
//1:条码
 
// 2:住院号
 
// 3:姓名
 
// 4:病区病床
 
// 5:项目名
 
// 6:样本类型(如 红色管 、蓝色管、 小便)

 
{
   现在显示打印预览 是为了调试方便,以后正式版本不显示 打印预览
 }


  
//静态调用
  Procedure PrintBarcode(Barcode,PatNo,PatName,SickBed,ItemStr,Sample:string);stdcall; External 'Barcode.dll';


implementation

{$R *.dfm}

//动态调用
procedure TForm1.Print2(Barcode,PatNo,PatName,SickBed,ItemStr,Sample:string);
type
  TMyProc 
=procedure (Barcode,PatNo,PatName,SickBed,ItemStr,Sample:string)  ;stdcall;
var
  DLLHandle: THandle;
  DLLSub: TMyProc;
  DllPath:
string;

begin
  DllPath:
='Barcode.dll';
  
if DllPath='' then  Exit;
  DLLHandle :
= LoadLibrary(Pchar(DllPath));
  
if DLLHandle <> 0 then
  begin
    @DLLSub :
= GetProcAddress(DLLHandle, 'PrintBarcode');
    
if Assigned(DLLSub) then
    begin


      DLLSub(Barcode,PatNo,PatName,SickBed,ItemStr,Sample);
    end;
  end;

end;


procedure TForm1.Button6Click(Sender: TObject); 
//静态调用
begin
  PrintBarcode(
'10001','23333','李先念','一区45床','肝功能组,肾功能组,蛋白组,电解质','红色管');
end;

procedure TForm1.Button1Click(Sender: TObject); 
//动态调用
begin
  Print2(
'10001','23333','李先念','一区45床','肝功能组,肾功能组,蛋白组,电解质','红色管');
end;

end.

用C#调用的例子:
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 WindowsApplication1
{
    
public partial class Form1 : Form
    
{
        
public Form1()
        
{
            InitializeComponent();
        }


        
private void button1_Click(object sender, EventArgs e)
        
{
            PrintBarcode(
"10001","23333","李先念","一区45床","肝功能组,肾功能组,蛋白组,电解质","红色管");

            
        }

        
        [DllImport(
"Barcode.dll", EntryPoint = "PrintBarcode", CharSet = CharSet.Ansi   ,
          CallingConvention 
= CallingConvention.StdCall)]
        
public extern static void PrintBarcode(string Barcode, string PatNo, string PatName,
            
string SickBed, string ItemStr, string Sample);
    }

}

用VF调用的例子:

DECLARE  PrintBarcode IN Barcode.dll STRING @ , STRING @,STRING @ ,STRING @ ,STRING
    @ ,STRING @ 

STORE 
'10001' TO Barcode
STORE 
'23333' TO PatNo
STORE 
'李先念' TO PatName
STORE 
'一区45床' TO SickBed
STORE 
'肝功能组,肾功能组,蛋白组,电解质' TO temStr
STORE 
'红色管' TO Sample1

PrintBarcode(@Barcode,@PatNo,@PatName,@SickBed,@temStr,@Sample1)


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值