線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1843
推到 Plurk!
推到 Facebook!

在C++討論區的用法,用DELPHI 語法有問題,請教 StatDocPrinter

答題得分者是:yyu10
whyzn
中階會員


發表:46
回覆:149
積分:54
註冊:2002-06-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-20 18:41:51 IP:218.162.xxx.xxx 未訂閱
請教先進,我在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-20 19:27:32 IP:220.244.xxx.xxx 未訂閱
OpenPrinter(pchar(mDriverName), @lhPrinter, nil); _________________________ Programming is a passion
whyzn
中階會員


發表:46
回覆:149
積分:54
註冊:2002-06-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-20 19:43:43 IP:218.162.xxx.xxx 未訂閱
可是這樣在編譯時會出錯 types os actual and formal var paramaters must be identical ●○○○○○●○○○○○● 竹密不妨水過,山高無礙雲飛
------
●○○○○○●○○○○○●
竹密不妨水過,山高無礙雲飛
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-21 09:36:50 IP:203.14.xxx.xxx 未訂閱
真是惭愧, 问题没有弄清楚就给答案了. 最初以为只是 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-21 19:50:47 IP:218.162.xxx.xxx 未訂閱
感謝 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-21 23:40:11 IP:218.162.xxx.xxx 未訂閱
對不起,是我的錯 已經可以列印,只是原先我沒有給換行或跳頁字元 以致資料都在Buffer中。 而且 mDriverName 要放印表機名稱而不是驅動程式名稱 再次感謝 yyu10 兄 ●○○○○○●○○○○○● 竹密不妨水過,山高無礙雲飛
------
●○○○○○●○○○○○●
竹密不妨水過,山高無礙雲飛
系統時間:2024-04-29 5:32:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!