0

CF2.0を介してWindowsMo​​bile6.5(プリンター付き)を搭載したデバイスで画像を印刷する必要があり、c ++ヘッダーファイルがあり、アンマネージコードを呼び出すクラスもラップしています:問題:これを読んでも画像を印刷する方法がわかりませんドキュメントドキュメント内

  1. PRNAPI UINT WINAPI PrinterLoadImageFile(LPCTSTR pszFile); 説明:画像ファイルを読み取ります。戻り値:PRINTER_OK:成功PRINTER_ERROR:エラー引数:LPCTSTR pszFile:[in]ファイルを読み取ります
  2. PRNAPI UINT WINAPI PrinterImage(int nMode); 説明:画像を印刷します。戻り値:PRINTER_OK:成功PRINTER_ERROR:エラー引数:int nMode:[in]画像の印刷モードを設定します。PRINTER_IMAGE_NORMAL:200 * 200 dpiデフォルトPRINTER_IMAGE_DOUBLEWIDTH:100 * 200 dpi PRINTER_IMAGE_DOUBLEHEIGHT:200 * 100 dpi PRINTER_IMAGE_QUADRUPLE:100 * 100 dpi
  3. PRNAPI UINT WINAPI PrinterCloseImageFile(); 説明:読み取り画像を削除します。戻り値:PRINTER_OK:成功PRINTER_ERROR:エラー
  4. PRNAPI LPCTSTR WINAPI PrinterGetImageName(); 説明:読み取られた画像の名前を取得します。戻り値:LPCTSTR:[out]ファイルの名前

そして私はこのラッパー.netコードが付属していました

    [DllImport(@"PRN_DLL.dll")]
    public static extern uint PrinterCloseImageFile();
    [DllImport(@"PRN_DLL.dll")]
    public static extern uint PrinterLoadImageFile(string pszFile); 
    [DllImport(@"PRN_DLL.dll")]
    public static extern uint PrinterImage(int nMode);
    [DllImport(@"PRN_DLL.dll")]
    public static extern char[] PrinterGetImageName();

hファイルの一部:

//Close Image File
_DLL_EXPORT_ UINT WINAPI PrinterCloseImageFile();

//Load Image File
_DLL_EXPORT_ UINT WINAPI PrinterLoadImageFile(TCHAR* pszFile);
_DLL_EXPORT_ void WINAPI PrinterSetImageLeft(UINT nImageLeft);//ÇöÀç ´Ü»öºñÆ®¸Ê¸¸ Áö¿ø °¡´ÉÇÔ(2008³â11¿ù)

//Print Image
_DLL_EXPORT_ UINT WINAPI PrinterImage(int nMode);

//Get Image Name
_DLL_EXPORT_ TCHAR* PrinterGetImageName();

このコードを呼び出すと

String path = PathInfo.GetStartupPath() + "\\logo.png";//Path to image
                NativPrinter.PrinterGetImageName();
                MessageBox.Show(NativPrinter.PrinterLoadImageFile(path).ToString());
                NativPrinter.PrinterImage(NativPrinter.PRINTER_IMAGE_NORMAL);
                NativPrinter.PrinterCloseImageFile();

PrinterLoadImageFileでエラーが発生します(印刷エラーを意味するエラーコード1000)。ですから、私の間違いがどこにあるのか、誰にでも手がかりを与えることができます。私の英語でごめんなさい。

4

1 に答える 1

0

呼び出しPrinterLoadImageFileが間違っている可能性がある明らかな方法は、C#コードがUTF-16 Unicodeテキストを渡すことですが、おそらくネイティブライブラリは8ビットANSIを想定しています。TCHAR何に拡張するのかわからないのでわかりません。その場合は、にを渡して手動でANSIに変換する必要がありIntPtrますPrinterLoadImageFile。使用する

byte[] ansiBytes = Encoding.Default.GetBytes(path);
byte[] pszPath = new byte[ansiBytes.Length + 1];//+1 for null terminator
ansiBytes.CopyTo(pszPath, 0);

バイト配列に格納されたヌル終了ANSI文字列に変換します。

次に、それをアンマネージヒープに割り当てられたnullで終了する文字列にコピーします。

IntPtr ptr = Marshal.AllocHGlobal(pszPath.Length);
Marshal.Copy(pszPath, 0, ptr, pszPath.Length);

次に、それをに渡すことができますPrinterLoadImageFile。メモリを使い終わったら、。で割り当てを解除しますMarshal.FreeHGlobal

もう1つの問題はPrinterGetImageNameです。ほぼ確実に、ライブラリに割り当てられている文字列へのポインタを返します。したがって、戻り値をとして宣言しIntPtrMarshalクラスを使用してC#文字列に変換する必要があります。あなたのコードは、p / invokeマーシャラーによって、によって返されたメモリのブロックの割り当てを解除しようとする結果になりますが、PrinterGetImageNameそれはあなたが望んでいることではないと確信しています。

于 2013-02-02T12:12:51.820 に答える