500分 求... 如何指定打印机执行打印任务....

mfc2003 2004-12-05 05:32:38
小弟 正做一个传真服务器 上的小模块
对邮件里发过来的 附件里的可打印文档 做为传真 发出去...
我现在是这样做的...
1: 分解邮件,然后把附件里的所有附件 一个个 放到一个指定的目录下, 如果是.tif /.tiff 文件 就直接发出去.如果是 .txt/htm/.doc 等..可打印的文档, 我就把它们
shellexcute(0,'print','..\beyond.txt',nil,nil,nil) 打印一下
然后再把打印出来的 .tif文件发出去...


现在问题是:
这个函数只能调用默认的打印机来打印.
而我想要的是,要调用我想要的打印机来打印,不能调用打印机配置窗口来选择想要的打印机,因为传真服务器是无人职守的. 我用 printer.printerindex 那个来设置..没有用..

谁能告诉我...
如何 在程序中调用一个打印机来打印,而不管默认的打印机是哪个.
或者: 如何在程序中把一个打印机设为默认打印机,

急啊//
大哥门江湖救急忙啊....
...全文
177 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
oracleby 2005-01-04
  • 打赏
  • 举报
回复
long SWGetDefaultPrinterName(LPSTR szDefaultPrinterName)
{
char Buffer[256], tmpBuf[256];
long iDefaultIsThere = -1;
long iColPos;
size_t iBufLen;

GetProfileString("windows", "device", ",,,", Buffer, sizeof(Buffer));

iBufLen = strlen(Buffer);

if (iBufLen > 0) {
iDefaultIsThere = 0; // there is a default printer

// make sure that temp buffer is clean
memset (tmpBuf, 0, sizeof(tmpBuf));

// get comma position
for (iColPos = 0; Buffer[iColPos] != ','; iColPos++)
; // do nothing

// copy iColPos + 1 bytes
strncpy(tmpBuf, Buffer, iColPos);
strcat (tmpBuf, "\0"); // terminate string

strcpy(szDefaultPrinterName, tmpBuf);

}

return iDefaultIsThere;
}


long SWGetDefaultPrinterDriver(LPSTR szDriver)
{
char Buffer[256], tmpBuf[256];
long iDefaultIsThere = -1;
long iColPos, iFirstColPos = 0;
size_t iBufLen;

GetProfileString("windows", "device", ",,,", Buffer, sizeof(Buffer));

iBufLen = strlen(Buffer);

if (iBufLen > 0) {
iDefaultIsThere = 0; // there is a default driver

memset(szDriver, 0, sizeof(szDriver));
memset(tmpBuf, 0, sizeof(tmpBuf));

// find first column
for (iColPos = 0; Buffer[iColPos] != ','; iColPos++)
iFirstColPos = iColPos; // save column position

++iFirstColPos;
++iFirstColPos;

// find second column
for (iColPos = iFirstColPos; Buffer[iColPos] != ','; iColPos++)
; // do nothing

strncpy(tmpBuf, Buffer + iFirstColPos, (iColPos -iFirstColPos));
strcat (tmpBuf, "\0");

strcpy(szDriver, tmpBuf);

}

return iDefaultIsThere;
}

long SWGetDefaultPrinterPort(LPSTR szPort)
{
char Buffer[256], tmpBuf[256];
long iDefaultIsThere = -1;
long iColPos, iSecondColPos = 0;
size_t iBufLen;

GetProfileString("windows", "device", ",,,", Buffer, sizeof(Buffer));

iBufLen = strlen(Buffer);

if (iBufLen > 0) {

iDefaultIsThere = 0; // there is a default driver

memset(tmpBuf, 0, sizeof(tmpBuf));
// find first column
for (iColPos = 0; Buffer[iColPos] != ','; iColPos++)
iSecondColPos = iColPos; // save column position

++iSecondColPos;
++iSecondColPos;

// find second column
for (iColPos = iSecondColPos; Buffer[iColPos] != ','; iColPos++)
iSecondColPos = iColPos; // save column position

++iSecondColPos;
++iSecondColPos;

strncpy(tmpBuf, Buffer + iSecondColPos, (iBufLen -iSecondColPos));
strcat (tmpBuf, "\0");

strcpy(szPort, tmpBuf);
}


return iDefaultIsThere;
}

char szMsg[512] = "";
#define cnstDefaultPrinter "Synway Fax Printer"
long SWSetDefaultPrinter()
{
char szDefaultPrinterName[256] = "";

SWGetDefaultPrinterName(szDefaultPrinterName);

sprintf(szMsg, "SWSetDefaultPrinter SWGetDefaultPrinterName is [%s]", szDefaultPrinterName);

if (stricmp(szDefaultPrinterName, cnstDefaultPrinter) == 0)
{
return 0;
}

// brute test
if (SWCheckPrinterName(cnstDefaultPrinter) == FALSE)
return -1;

// To set the default printer for Windows NT use:
/* Note printer driver is usually WINSPOOL under Windows NT */
char Driver[256], PrinterDriverPort[1000];

memset(Driver, 0, sizeof(Driver));
//memset(Port, 0, sizeof(Port));
memset(PrinterDriverPort, 0, sizeof(PrinterDriverPort));

// get other info
//SWGetDefaultPrinterPort(Port);
SWGetDefaultPrinterDriver(Driver);
// put them all together
strcpy(PrinterDriverPort, cnstDefaultPrinter);//printer driver
strcat(PrinterDriverPort, ",");
strcat(PrinterDriverPort, Driver); //printer name
strcat(PrinterDriverPort, ",");
strcat(PrinterDriverPort, "fax"); //port
strcat(PrinterDriverPort, "\0");

//eg "My Printer,WINSPOOL,lpt1:"
WriteProfileString("windows", "device", PrinterDriverPort);
PostMessage(HWND_BROADCAST, WM_WININICHANGE, 0L, 0L);

return 0;
}
anbeel 2004-12-07
  • 打赏
  • 举报
回复
zt:




这是一个设置默认打印机的程序




unit MainFrm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TMainForm = class(TForm)
cbPrinters: TComboBox;
lblPrinter: TLabel;
procedure FormCreate(Sender: TObject);
procedure cbPrintersChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation
uses IniFiles, Printers;

{$R *.DFM}

procedure TMainForm.FormCreate(Sender: TObject);
begin
cbPrinters.Items.Assign(Printer.Printers);
cbPrinters.Text := Printer.Printers[Printer.PrinterIndex];
lblPrinter.Caption := Printer.Printers[Printer.PrinterIndex];
end;

procedure TMainForm.cbPrintersChange(Sender: TObject);
var
IniFile: TIniFile;
TempStr1, TempStr2: String;
S: array[0..64] of char;
begin
with Printer do
begin
PrinterIndex := cbPrinters.ItemIndex;
TempStr1 := Printers[PrinterIndex];
System.Delete(TempStr1, Pos(' on ', TempStr1), Length(TempStr1));
IniFile := TIniFile.Create('WIN.INI');
try
TempStr2 := IniFile.ReadString('Devices', TempStr1, '');
IniFile.WriteString('windows', 'device', TempStr1 + ',' + TempStr2);
StrCopy(S, 'windows');
SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@S));
finally
IniFile.Free;
end;
end;
lblPrinter.Caption := Printer.Printers[Printer.PrinterIndex];
end;

end.



ljyt 2004-12-07
  • 打赏
  • 举报
回复
TPrinter类有个Printers属性可以列出所有你已安装的打印机,然后可以利用TPrintDlg来处理
BigAngell 2004-12-06
  • 打赏
  • 举报
回复
学习...
zwb666 2004-12-06
  • 打赏
  • 举报
回复
printer.printerindex:=0

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧