我从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
我尝试过这方面的变化无济于事。
答案 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)> _