从VB.Net调用Windows SDK GetGlyphIndices

时间:2009-08-19 20:48:24

标签: vb.net interop

我从Vb.Net打电话给GetGlyphIndices。我正在使用单个字符串。我在字符6的indices数组中得到了正确的值,但是对于需要返回2个字节的字符却没有。

有没有人有过这次API调用的经验?我的下一步是编写C等价物,并确保我可以在没有互操作的情况下使其工作。

我的pinvoke声明是:

<DllImport("gdi32.dll", EntryPoint:="GetGlyphIndicesW")> _
Private Shared Function GetGlyphIndices(ByVal hDC As IntPtr, 
                                        ByVal Text As String, 
                                        ByVal Count As Int32, 
     <MarshalAs(UnmanagedType.LPArray)> ByVal Indices() As UInt16, 
                                        ByVal Mode As Int32) As Int32

End Function

我尝试过这方面的变化无济于事。

3 个答案:

答案 0 :(得分:0)

你可以尝试一下吗?

<DllImportAttribute("gdi32.dll", EntryPoint:="GetGlyphIndicesW")> _
Public Shared Function GetGlyphIndicesW( _
    <InAttribute()> ByVal hdc As System.IntPtr, _
    <InAttribute(), MarshalAsAttribute(UnmanagedType.LPTStr)> ByVal lpstr As String, _
    ByVal c As Integer, _
    <OutAttribute()> ByRef pgi As UShort, _
    ByVal fl As UInteger) As UInteger

答案 1 :(得分:0)

进一步的测试表明

<DllImport("gdi32.dll", EntryPoint:="GetGlyphIndicesW")> _
Private Shared Function GetGlyphIndices(ByVal hdc As System.IntPtr, _
                                      <MarshalAsAttribute(UnmanagedType.LPTStr)> ByVal lpstr As String, _
                                      ByVal c As UInteger, _
                                      <MarshalAs(UnmanagedType.LPArray)> ByVal Indices() As UInt16, ByVal Mode As UInteger) As UInteger
End Function

用于返回字符串的字形索引数组。实现此功能的关键属性是字符串MarshalAsAttribute(UnmanagedType.LPTStr。我自己愚蠢地认为字符串是自动编组的(回到VB6?)。

请注意,GetGlyphIndices仅适用于返回1-2个字节的Unicode。幸运的是,中文/日文可以使用PDF格式的内置CMAP进行处理。

答案 2 :(得分:0)

原始声明不正确,因为您通过设置EntryPoint =“GetGlyphIndicesW”明确定位API的Unicode版本,而未指定字符编码,因此使用默认值ANSI。所以你得到了Unicode / ANSI不匹配。

解决问题的最简单方法是将DllImport属性更改为

<DllImport("gdi32.dll", CharSet:=CharSet.Auto)> _