Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 从hDC创建图形会导致算术运算溢出_Vb.net_Winapi - Fatal编程技术网

Vb.net 从hDC创建图形会导致算术运算溢出

Vb.net 从hDC创建图形会导致算术运算溢出,vb.net,winapi,Vb.net,Winapi,我尝试使用WinAPI而不是(System.Drawing.printing.PrintDocument)来准备打印文档,因为Graphic.DrawString不能正确呈现高棉Unicode。只有TextRendering.DrawText可以正确渲染它。我相信Graphic是GDI+包装器和TextRendering.DrawText使用的是GDI。此外,PrintDocument不适用于TextRendering.DrawText Private Declare Function Crea

我尝试使用WinAPI而不是(System.Drawing.printing.PrintDocument)来准备打印文档,因为Graphic.DrawString不能正确呈现高棉Unicode。只有TextRendering.DrawText可以正确渲染它。我相信Graphic是GDI+包装器和TextRendering.DrawText使用的是GDI。此外,PrintDocument不适用于TextRendering.DrawText

Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" _
(ByVal lpDriverName As String, ByVal lpDeviceName As String, _
 ByVal lpOutput As String, ByVal lpInitData As DEVMODE) As Long
Private Declare Function EndDoc Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function StartDoc Lib "gdi32" Alias "StartDocA" (ByVal hdc As Long, ByVal lpdi As DOCINFO) As Long
Private Declare Function StartPage Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function EndPage Lib "gdi32" (ByVal hdc As Long) As Long

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    '' Getting Printer hDC
    Dim printHandler As Long = CreateDC(Nothing, "Send To OneNote 2010", Nothing, Nothing)
    Dim docInfo As New DOCINFO
    docInfo.cbSize = Len(docInfo)
    docInfo.lpszDatatype = Nothing
    docInfo.lpszOutput = Nothing
    docInfo.lpszDocName = "Testing"

    StartDoc(printHandler, docInfo)
    StartPage(printHandler)

    Dim g As Graphics = Graphics.FromHdc(printHandler)
    TextRenderer.DrawText(g, "Hello World", Me.Font, New Point(10, 10), Color.Black)

    EndPage(printHandler)
    EndDoc(printHandler)
End Sub
这是我的尝试。这行代码失败:
Dim g As Graphics=Graphics.FromHdc(printHandler)
。看起来Long是64位,IntPtr是32位


有什么解决方法吗?

对于VB.NET,所有的p/Invoke定义都是错误的。很明显,你是从一个以VB6为目标的项目或网站上复制它们的,但是.NET改变了很多东西

正确的定义如下所示:

<DllImport("gdi32.dll", SetLastError:=False, CharSet:=CharSet.Auto)> _
Private Shared Function CreateDC(lpszDriver As String, _
                                 lpszDevice As String, _
                                 lpszOutput As IntPtr, _
                                 ByRef lpInitData As DEVMODE) As IntPtr
End Function

<DllImport("gdi32.dll", SetLastError:=False)> _
Private Shared Function EndDoc(hdc As IntPtr) As Integer
End Function

<DllImport("gdi32.dll", SetLastError:=False)> _
Private Shared Function StartDoc(hdc As IntPtr, ByRef lpdi As DOCINFO) As Integer
End Function

<DllImport("gdi32.dll", SetLastError:=False)> _
Private Shared Function StartPage(hdc As IntPtr) As Integer
End Function

<DllImport("gdi32.dll", SetLastError:=False)> _
Private Shared Function EndPage(hdc As IntPtr) As Integer
End Function
并将
IntPtr.Zero
传递给
lpInitData
,就像传递给
lpszOutput
一样,按照-
IntPtr.Zero
的指示。对于指针类型,Zero实际上等同于
NULL

DOCINFO
结构将声明为:

<StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)> _
Private Structure DOCINFO
    Dim cbSize As Integer
    Dim lpszDocName As String
    Dim lpszOutput As String
    Dim lpszDatatype As String
    Dim fwType As Integer
End Structure
_
私有结构DOCINFO
Dim cbSize为整数
Dim lpszDocName作为字符串
Dim LPSZ输出为字符串
Dim lpszDatatype作为字符串
将类型设置为整数
端部结构
根据,
fwType
成员可以是以下任一常数:

  • 0
  • Private Const DI_APPBANDING As Integer=&H1
  • Private Const DI_ROPS_READ_DESTINATION As Integer=&H2


所有这些都说明了…你知道在.NET世界中有更简单的打印方式,对吗?

为什么你声明
CreateDC
返回
Long
?API返回一个
HDC
,所以使用
IntPtr
。在我问这个问题之前,我已经试过IntPtr了。当我使用Long时,它将OneNote 2010作为打印机打开。当我使用IntPtr时,它什么都不做。我知道更简单。使用PrintDocument及其PrintPage事件。关键是PrintDocument不能与TextRendering一起使用。我已经改变了你建议的一切。CreateDC返回null。我会设法解决的。(如果我自己无法修复,我会再次来到这里)欢呼。@invisal在不知道传递给函数的参数是什么的情况下,我无法告诉您对
CreateDC
的调用有什么问题。当它返回
NULL
时,表示函数失败。确保检查并确保传递的参数有效。(另外,我忘了在我的回答中包括,您必须在使用完
CreateDC
创建的设备上下文后,调用来销毁它,否则您将泄漏内存。)
<StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)> _
Private Structure DOCINFO
    Dim cbSize As Integer
    Dim lpszDocName As String
    Dim lpszOutput As String
    Dim lpszDatatype As String
    Dim fwType As Integer
End Structure