- PR -

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

投稿者投稿内容
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-09 11:49
> OpenPrinterの第三引数の型の定義は、
> 実際に関数を使用するときにはnullでもいいのですが、
> 定義する場合にはやはり構造体を調べて定義しなければいけないのでしょうか?
> VBではInteger型で指定していますよね。
> 同じようにC#でも例えばint型なんかで代用することは出来るのでしょうか?

代用できなくはないと思いますが、VB6と.NETは別物ですし、今後違う関数で構造体を使う必要がでてきた際にすべてintで代用できるとは思えません。
構造体の中にはさらに複雑な物もありますし、引数で渡した構造体などのポインタに値を入れて返してくる関数も存在するため、きちんとした型に合わせてクラス、または構造体を定義することをお勧めします。

それと、提示していただいたC#のコードにlong型が指定されていますが、基本的に(多分他の関数においても)longは使いません。引数の型に関しては、私が先に提示した通りで問題ないと思います。
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-09 12:07
補足です。

「引数が構造体である場合、nullを指定したくても結局メソッド定義のところで型を定義しなくてはいけないので、どうすれば良いのか?」という話ですね。

私の使用した関数に関してはnullは許可されていなかったので、構造体のクラス、または構造体を独自に定義して使用しました。
当然、null以外の指定であれば独自にクラスなどを用意する必要があると思いますが、null指定時にintなどで代用できるのであれば、それでも良いのかも知れません。null指定だけのためにクラスなどを用意するのも面倒ですしね。
ringosan
常連さん
会議室デビュー日: 2002/12/13
投稿数: 43
投稿日時: 2003-01-09 12:43
返答ありがとうございます。
>それと、提示していただいたC#のコードにlong型が指定されていますが、
>基本的に(多分他の関数においても)longは使いません。
>引数の型に関しては、私が先に提示した通りで問題ないと思います。
すいません。前回書き込んだものを引用したつもりでした。申し訳ないです。

現在、構造体を作ってみたのですが、わからないところが3つあります。
VisualStudio6.0のAPIビューアーで一旦VBのコードにして、それを
C#に書き直すという方法でやっています。(他にいい方法が思いつかなかったので…)
まず1点、
******************************************************************
Public Type DEVMODE
dmDeviceName As String * CCHDEVICENAME ←CCHDEVICENAME=32
dmSpecVersion As Integer
       〜省略〜
dmDisplayFrequency As Long
End Type
******************************************************************
このdmDeviceName As String * CCHDEVICENAME の
String * 32 というのはC#でどのように表現すればよいのでしょうか?
そして、2点目は、

PRINTER_ACCESS_ADMINISTER = &H4
という定数があるのですが、C#では&H4をどう書くのでしょうか?

最後に3点目、
APIビューアーでVBのコードに展開してみたところデータ型が
Long,Integer,String,String*32 
の4種類でしたが、これをC#に当てはめると、
Long → long
Integer → int
String → string
と考えていいのでしょうか?

以上、初歩的な質問かと思いますがどうぞよろしくお願いします。

rucio
ベテラン
会議室デビュー日: 2002/11/27
投稿数: 98
投稿日時: 2003-01-09 13:04
こんにちは。
第3引数にNULLを渡すのならば構造体を宣言する必要は皆無です。
とりわけこの構造体は難しい部類に属する構造体なので無視できるなら無視したほうがいいと思います。

>String * 32 というのはC#でどのように表現すればよいのでしょうか?
これは、32バイトの固定長文字列ですがたしか.NETでは固定長文字列はサポートされていなかったと思います。配列になるのでしょうか。私もよくわかりません。

>C#では&H4をどう書くのでしょうか?
0x4ですね。VBでは&Hで16進数を表現します。

>Long → long
>Integer → int
>String → string
>と考えていいのでしょうか?
違います。
VB6 VB.NET C#
Long Integer int
Integer Short short
String String string
だったと思います。

このようにテーマが変遷するのであれば別スレッドにして個別に質問されてはどうかと思います。

最後にプリンタハンドルを取得するC#版のサンプルを作りました。
私はC#もC言語もあまりわからないのでよくないコードになっているのかも知れませんが実験の結果プリンタハンドルらしきものは取得できました。

===========API宣言================
[DllImport("winspool.drv")]
private static extern int OpenPrinter(string pPrinterName, ref int phPrinter, int pDefault);

[DllImport("winspool.drv")]
private static extern int ClosePrinter(int hPrinter);

=================================
private void button1_Click(object sender, System.EventArgs e)
{
int hPrinter = 0;
int Ret;

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

if (Ret == 0)
{
textBox1.Text = "失敗" ;
}else{
textBox1.Text = hPrinter.ToString();
}

ClosePrinter(hPrinter);

}





ringosan
常連さん
会議室デビュー日: 2002/12/13
投稿数: 43
投稿日時: 2003-01-09 13:33
rucioさんありがとうございます。

>このようにテーマが変遷するのであれば別スレッドにして個別に質問されてはどうかと思います。
すいません。以後気をつけます。

作っていただたサンプルを使って動きました。
私は第三引数の定義がおかしくて動かないものだとばかり思っておりました。
どうも、原因は第二引数のハンドルを取得するところが間違っていたようです。
*****************************************************************
[DllImport("winspool.drv")]
private static extern int OpenPrinter(
string pPrinterName,
ref int phPrinter,  ←refをつけていなかった。
int pDefault);
*****************************************************************
上のソースで正常に動くようになりました。
本当に長いことお付き合いくださってありがとうございます。
構造体を作ってはみたのですが、自信も無いので、rucioさんのおっしゃるように
構造体を無視して作ることにします。
どうもありがとうございました。


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