0

我需要通过 CF 2.0 使用 windows mobile 6.5(带打印机)在设备中打印图像,并且我有 c++ 头文件,并且我还包装了调用非托管代码的类: 问题:即使我读到这个,我也不知道如何打印图像文档 文档中

  1. PRNAPI UINT WINAPI PrinterLoadImageFile (LPCTSTR pszFile); 描述:读取图像文件。返回: PRINTER_OK: Success PRINTER_ERROR: Errors Argument: LPCTSTR pszFile: [in] file to read
  2. PRNAPI UINT WINAPI PrinterImage (int nMode); 描述:打印图像。返回: PRINTER_OK: Success PRINTER_ERROR: Errors 参数: 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扩展为什么。如果是这样,那么您需要传递一个IntPtrtoPrinterLoadImageFile并手动转换为 ANSI。利用

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.

另一个问题是PrinterGetImageName。几乎可以肯定,这会返回一个指向在库中分配的字符串的指针。因此,您需要将返回值声明为IntPtr,并使用Marshal该类转换为 C# 字符串。您的代码将导致 p/invoke marshaller 尝试释放返回的内存块,PrinterGetImageName我确定这不是您想要的。

于 2013-02-02T12:12:51.820 回答