在C++討論區的用法,用DELPHI 語法有問題,請教 StatDocPrinter |
答題得分者是:yyu10
|
whyzn
中階會員 發表:46 回覆:149 積分:54 註冊:2002-06-16 發送簡訊給我 |
請教先進,我在C++討論區找到一段程式碼,想引用在DELPHI 中
但是有個程序怪怪的,請問
這是 C++ 內容 HANDLE hPrinter;
int iLen = strlen(szBuffer);
DWORD dwWritten;
DOC_INFO_1 Info;
int szInfo = sizeof(Info); OpenPrinterA(szPrinterName, &hPrinter, NULL)
Info.pDocName = "The Test Print";
Info.pOutputFile = NULL;
Info.pDatatype = ""; StartDocPrinterA(hPrinter, 1, (LPBYTE)&Info)
StartPagePrinter(hPrinter);
WritePrinter(hPrinter, szBuffer, iLen, &dwWritten)
EndPagePrinter(hPrinter
EndDocPrinter(hPrinter)
ClosePrinter(hPrinter 改成DELPHI如下 lhPrinter: THandle;
lpcWritten: Cardinal;
MyDocInfo: DOCINFO; OpenPrinter(pchar(mDriverName), lhPrinter, nil);
MyDocInfo.pDocName := 'The Test Print';
MyDocInfo.pOutputFile := '';
MyDocInfo.pDatatype := '';
StartDocPrinter(lhPrinter, 1, @MyDocInfo)
StartPagePrinter(lhPrinter);
WritePrinter(lhPrinter, PChar(mDATA), Length(mDATA), lpcWritten);
EndPagePrinter(lhPrinter);
EndDocPrinter(lhPrinter);
ClosePrinter(lhPrinter); 我的問題是 在 C 中的 &hPrinter 參數
改在 DELPHI 中該如何給winapi
因為 無法從 winapi 中取回正確的 lhPrinter
那麼接下來的 StartDocPrinter(lhPrinter, 1, @MyDocInfo) 就會出錯 ●○○○○○●○○○○○●
竹密不妨水過,山高無礙雲飛
------
●○○○○○●○○○○○● 竹密不妨水過,山高無礙雲飛 |
yyu10
中階會員 發表:9 回覆:99 積分:96 註冊:2005-02-18 發送簡訊給我 |
|
whyzn
中階會員 發表:46 回覆:149 積分:54 註冊:2002-06-16 發送簡訊給我 |
|
yyu10
中階會員 發表:9 回覆:99 積分:96 註冊:2005-02-18 發送簡訊給我 |
真是惭愧, 问题没有弄清楚就给答案了. 最初以为只是 C++ 到 Delphi 的转换问题, 所以没有作测试.
引言: OpenPrinter(pchar(mDriverName), lhPrinter, nil);实际上lhPrinter是作为var传给OpenPrinter的, 没有必要作取地址运算. 你最初的那行代码没有问题. 问题出在Delphi本身. Delphi在Windows.pas中定义了DOCINFO. 它与Window API并不匹配. (不知道Why). _DOCINFOA = packed record cbSize: Integer; lpszDocName: PAnsiChar; lpszOutput: PAnsiChar; lpszDatatype: PAnsiChar; fwType: DWORD; end;你需要自己定义DOCINFO. My_DOCINFOA = packed record lpszDocName: PAnsiChar; lpszOutput: PAnsiChar; lpszDatatype: PAnsiChar; end;下面的测试程式是在Delphi7中通过了, 在D5中也没有问题. 基本上是你的代码加上测试语句. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses WinSpool; {$R *.dfm} function GetLastErrorText(): string; var dwSize: DWORD; lpszTemp: PAnsiChar; dwError: DWORD; begin dwError := GetLastError(); dwSize := 512; lpszTemp := nil; try GetMem(lpszTemp, dwSize); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, dwError, LANG_NEUTRAL, lpszTemp, dwSize, nil) finally Result := lpszTemp; FreeMem(lpszTemp) end; Result := Format('Error %d: %s', [dwError, Result]); end; type My_DOCINFOA = packed record lpszDocName: PAnsiChar; lpszOutput: PAnsiChar; lpszDatatype: PAnsiChar; end; procedure TForm1.Button1Click(Sender: TObject); var lhPrinter: THandle; lpcWritten: Cardinal; MyDocInfo: My_DOCINFOA; mDriverName: string; mData: string; a: LongBool; b: boolean; c: DWORD; begin mDriverName := '\\srv-qs-print1\QS5E-LM-1'; mData := 'http://delphi.ktop.com.tw/forum.asp?FORUM_ID=70'; a := OpenPrinter(pchar(mDriverName), lhPrinter, nil); Assert(a); MyDocInfo.lpszDocName := 'The Test Print'; MyDocInfo.lpszOutput := nil; MyDocInfo.lpszDatatype := nil; c := StartDocPrinter(lhPrinter, 1, @MyDocInfo); //Assert(c <> 0); if c = 0 then begin ShowMessage(GetLastErrorText); Exit; end; b := StartPagePrinter(lhPrinter); Assert(b); b := WritePrinter(lhPrinter, PChar(mDATA), Length(mDATA), lpcWritten); Assert(b); b := EndPagePrinter(lhPrinter); Assert(b); b := EndDocPrinter(lhPrinter); Assert(b); b := ClosePrinter(lhPrinter); Assert(b); end; end.發表人 - yyu10 於 2005/03/21 09:39:20 |
whyzn
中階會員 發表:46 回覆:149 積分:54 註冊:2002-06-16 發送簡訊給我 |
感謝 yyu10 兄
我的環境是 win98 + Delphi4
把您給的程式碼放在上述環境中是不會有錯誤,但是印不出東西,印表機沒動靜
而且我看您的程式碼
mDriverName := '\\srv-qs-print1\QS5E-LM-1';
mData := 'http://delphi.ktop.com.tw/forum.asp?FORUM_ID=70';
a := OpenPrinter(pchar(mDriverName), lhPrinter, nil);
mDriverName 應該是放驅動程式
我的印表機是如下(win.ini 的 Devices)
EPSON Stylus COLOR 640=EPIJNL20,LPT1:
如果我用
mDriverName:='EPSON Stylus COLOR 640';
可以執行(但是沒印資料)
但若換成
mDriverName:='EPIJNL20';
就不行了(執行 OpenPrinter 時有錯誤) 難道是在 win98 Delphi4 中不能用這些指令
●○○○○○●○○○○○●
竹密不妨水過,山高無礙雲飛
------
●○○○○○●○○○○○● 竹密不妨水過,山高無礙雲飛 |
whyzn
中階會員 發表:46 回覆:149 積分:54 註冊:2002-06-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |