library print;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils,
WinSpool,
Windows,
Messages,
Classes;
var
hPrinter: THandle;
{$R *.res}
Function GetDefaultPrinterName():PChar; //得到默认的打印机名称
var
sIniFile, sSection, sKeyName,p,q: PChar;
begin
sIniFile := 'win.ini';
sSection := 'windows';
sKeyName := 'device';
p:=StrAlloc(80);
q:=StrAlloc(80);
GetPrivateProfileString(sSection,sKeyName,nil,p,80,sIniFile);
StrLCopy(q,p,(strscan(p,',')-p));
Result := q;
end;
Function addpage():Boolean; //添加一打印纸张类型名称为300k
var
FormInfo: TFormInfo1;
PaperSize: TSize;
PaperRect: TRect;
begin
FormInfo.Flags := FORM_USER;
FormInfo.pName := PChar('300k');
PaperSize.cx := 100000;
PaperSize.cy := 100000; //300k纸张的默认大小 1000mm*1000mm
PaperRect.Left := 1;
PaperRect.Top := 1;
PaperRect.Right := 100000;
PaperRect.Bottom := 100000; //纸张的边距
FormInfo.Size := PaperSize;
FormInfo.ImageableArea := PaperRect;
AddForm(hPrinter, 1, @FormInfo);
Result := True;
end;
Function changepape():Boolean; //改变当前的打印纸张设置
var
FormInfos : Array [1..1024] of Form_Info_1;
cbNeeded, cReturned ,neededsize: DWORD;
i,j:integer;
ppo:PRINTER_INFO_2;
dev :PDeviceMode;
begin
EnumForms(hPrinter, 1, Nil, 0, cbNeeded, cReturned);
EnumForms(hPrinter, 1, @FormInfos, cbNeeded, cbNeeded, cReturned );
j := 0;
for i:= 1 to cReturned do 通过轮寻找到300k的纸张的纸张类型排序号
if FormInfos[i].pName = '300k' then j:=i;
if j=0 then
begin
addpage();
j := cReturned + 1;
end; //如无300k纸张则添加
GetPrinter(hPrinter,2,Nil, 0, @NeededSize);
GetPrinter(hPrinter, 2, @ppo, NeededSize, @NeededSize);
dev := ppo.pDevMode;
dev.dmPaperSize := j;
ppo.pDevMode := dev;
SetPrinter(hPrinter,2,@ppo,0); //定义打印机列表并选择300k纸张
Result := True;
end;
Function MySetPrtInfo(P:Pchar;W:Integer;L:Integer):Boolean;stdcall;
//设置打印机的纸张类型为300k,并动态修改300k的大小和边距
var
FormInfo: TFormInfo1;
PaperSize: TSize;
PaperRect: TRect;
begin
OpenPrinter(GetDefaultPrinterName, hPrinter, nil);
changepape(); //改变纸张类型定义
FormInfo.Flags := FORM_USER;
FormInfo.pName := '300K';
PaperSize.cx := W*100;
PaperSize.cy := L*100;
PaperRect.Left := 0;
PaperRect.Top := 0;
PaperRect.Right := W*100;
PaperRect.Bottom := L*100;
FormInfo.Size := PaperSize;
FormInfo.ImageableArea := PaperRect;
SetForm(hPrinter,'300k',1,@FormInfo); //设置纸张大小
ClosePrinter(hPrinter);
Result := True;
end;
exports
MySetPrtInfo;
begin
end.
博客介绍了Delphi中DLL内存管理要点,若DLL导出传递字符串的过程或函数,ShareMem须为库和项目USES子句首单元。还给出多个函数代码,包括获取默认打印机名称、添加打印纸张类型、改变打印纸张设置等,最终导出MySetPrtInfo函数用于设置打印机纸张类型、大小和边距。
673

被折叠的 条评论
为什么被折叠?



