- PR -

ラベルプリンタに制御コマンドを送るには?

投稿者投稿内容
rucio
ベテラン
会議室デビュー日: 2002/11/27
投稿数: 98
投稿日時: 2003-01-07 14:35
すいません。VBのサンプルを元にC#を記述しているという話でしたね。
どうやら参考にされたVBのサンプルはVB6のもののようですね。
VB6の型と.NET Frameworkの型は名前が似ていても違うものがあるので注意です。
ringosan
常連さん
会議室デビュー日: 2002/12/13
投稿数: 43
投稿日時: 2003-01-07 14:47
rucioさん、ありがとうございます。

longとしていたところをintに直してみました。
しかし、やはりうまくいきません。
もう少し引数の型の辺りを調べてみます。


二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-07 14:51
> 実際に使用したいOpenPrinter関数がうまくいきません。
> VBのサンプルを元にして作ったので何かがおかしいと思うのですが原因がわかりません。
> OpenPrinterで戻り値が0になってしまいます。

VBと.NETでは型が違うので、VBのサンプルは役に立たない可能性があります。そのため、ヘルプでプラットフォームSDKのOpenPrinter関数を調べ、引数などを.NETの対応型に合わせる必要があると思います。

OpenPrinter関数の引数は以下の通りです。
第一引数...UnmanagedType.LPTStr指定のstring。ヘルプの「文字列に対する既定のマーシャリング」ページを参照のこと。
第二引数...(LPHANDLE)は.NETのヘルプに記載が無いが、ハンドルだからIntPtrかも。
第三引数...longではなく構造体。必要なければnull値も可。

それと、指定するDLLは「winspool.drv」ではなく「Winspool.lib」なのでは?
プラットフォームSDKのOpenPrinter関数のヘルプページには「インポートライブラリ:Winspool.lib を使用」と記載されていますよ。
ringosan
常連さん
会議室デビュー日: 2002/12/13
投稿数: 43
投稿日時: 2003-01-07 15:55
二天さん詳しくどうもありがとうございます。

私もプラットフォームSDKのOpenPrinter関数を調べてみました。

>第一引数...UnmanagedType.LPTStr指定のstring。ヘルプの「文字列に対する既定のマーシャリング」ページを参照のこと。
>第二引数...(LPHANDLE)は.NETのヘルプに記載が無いが、ハンドルだからIntPtrかも。
>第三引数...longではなく構造体。必要なければnull値も可。

第三引数の構造体で、必要なければnull値も可とあるのですが、
その構造体自体の定義はどうやったらわかるのでしょうか?
教えてください、お願いします。

>それと、指定するDLLは「winspool.drv」ではなく「Winspool.lib」なのでは?
>プラットフォームSDKのOpenPrinter関数のヘルプページには「インポートライブラリ:Winspool.lib を使用」と記載されていますよ。
指定するDLLを「Winspool.lib」にするとDLLを読み込めませんというエラーになり
ます。
他のサンプルを見ても「winspool.drv」を使用しているようなので、そうしています。
明確な理由がわからずすいません。
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-07 17:10
> 私もプラットフォームSDKのOpenPrinter関数を調べてみました。

> >第一引数...UnmanagedType.LPTStr指定のstring。ヘルプの「文字列に対する既定のマーシャリング」ページを参照のこと。
> >第二引数...(LPHANDLE)は.NETのヘルプに記載が無いが、ハンドルだからIntPtrかも。
> >第三引数...longではなく構造体。必要なければnull値も可。

> 第三引数の構造体で、必要なければnull値も可とあるのですが、
> その構造体自体の定義はどうやったらわかるのでしょうか?
> 教えてください、お願いします。

ヘルプのOpenPrinter関数ページの引数(パラメータ)のところにすべて記載されていますよ。

ハンドルを取得するのであれば、第三引数はnullで十分の気もします。
構造体を使うだけでもそれなりのクラス、または構造体を用意しなくてはいけないので意外に面倒なのですが、PRINTER_DEFAULTS構造体の内部でもさらに構造体を使用しているのでかなり面倒だと思います。


> >それと、指定するDLLは「winspool.drv」ではなく「Winspool.lib」なのでは?
> >プラットフォームSDKのOpenPrinter関数のヘルプページには「インポートライブラリ:Winspool.lib を使用」と記載されていますよ。
> 指定するDLLを「Winspool.lib」にするとDLLを読み込めませんというエラーになり
ます。
> 他のサンプルを見ても「winspool.drv」を使用しているようなので、そうしています。
> 明確な理由がわからずすいません。

ヘルプの方の記載間違いかな??
rucio
ベテラン
会議室デビュー日: 2002/11/27
投稿数: 98
投稿日時: 2003-01-07 17:22
VB.NETで作ってみました。
正しいかどうか自身はいまいちですがハンドルらしきものは取得できています。

Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, ByRef phPrinter As Integer, ByVal pDefault As Integer) As Integer
Private Declare Function ClosePrinter Lib "winspool.drv" Alias "ClosePrinter" (ByVal hPrinter As Integer) As Integer

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


Dim hPrinter As Integer
Dim Ret As Integer

Ret = OpenPrinter("Your Printer Name", hPrinter, 0)

If Ret = 0 Then
TextBox1.Text = "失敗"
Else
TextBox1.Text = hPrinter
End If

Call ClosePrinter(hPrinter)

End Sub

APIを利用する場合にはプラットフォームSDKが読めるようにならないときついです。けれど私が.NETでAPIを使う場合はVB6のAPIビューワで宣言をコピーしてVB.NETに貼り付け、その後手動で微調整をしています。
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-07 17:31
補足です。

> ハンドルを取得するのであれば、第三引数はnullで十分の気もします。
> 構造体を使うだけでもそれなりのクラス、または構造体を用意しなくてはいけない
> ので意外に面倒なのですが、PRINTER_DEFAULTS構造体の内部でもさらに構造体を使
> 用しているのでかなり面倒だと思います。

PRINTER_DEFAULTS構造体の内部で使用しているDEVMODE構造体は、はっきり言って「C#で開発したくないレベル」のものですね。
C#からプラットフォームSDKの関数を呼び出すコードを記載した経験から、「C#(またはVB.NET)よりもC++で開発した方が遙かに楽なのではないだろうか?」という気持ちでいます。
C#から関数を呼び出した時にエラーになっても理由がさっぱりわかりませんし、今回のPRINTER_DEFAULTS構造体に関しても、内部で指定する定数(PRINTER_ACCESS_ADMINISTERなど)の値は「Winspool.h」ファイルなどから手作業で見つけてこないと使えません。
ringosan
常連さん
会議室デビュー日: 2002/12/13
投稿数: 43
投稿日時: 2003-01-09 10:55
rucioさん、二天さんお付き合いいただいてどうもありがとうございます。
返事が遅くなり申し訳ないです。

>ハンドルを取得するのであれば、第三引数はnullで十分の気もします。
>構造体を使うだけでもそれなりのクラス、または構造体を用意しなくてはいけないので
>意外に面倒なのですが、PRINTER_DEFAULTS構造体の内部でもさらに構造体を使用して
>いるのでかなり面倒だと思います。
何度も同じようなことを聞いてしまっているようなのですが、
お許しください。
OpenPrinterの第三引数の型の定義は、
実際に関数を使用するときにはnullでもいいのですが、
定義する場合にはやはり構造体を調べて定義しなければいけないのでしょうか?
VBではInteger型で指定していますよね。
同じようにC#でも例えばint型なんかで代用することは出来るのでしょうか?

//C#時のソース********************
[DllImport("winspool.drv")]
private static extern int OpenPrinter(
string pPrinterName,
long phPrinter,
long pDefault); ←ここで定義する場合にどうなるのでしょうか?
//プリンタハンドルを取得時**************
long lRet;
long plPrinterHandl = 0;
lRet = OpenPrinter("XXXX MR999e",plPrinterHandl, 0);
↑nullにしたい。
よろしくお願いします。




スキルアップ/キャリアアップ(JOB@IT)