Вызов Windows SDK GetGlyphIndices из VB.Net - PullRequest
0 голосов
/ 20 августа 2009

Я звоню GetGlyphIndices из Vb.Net. Я использую одну строку символов. Я получаю правильное значение в массиве индексов для символа 6, но не для символов, требующих возврата 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 голосов
/ 20 августа 2009

Дальнейшие тесты показывают, что

<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 байта. К счастью, китайский / японский языки могут быть обработаны с помощью встроенного CMAP в PDF.

0 голосов
/ 31 августа 2009

Исходное объявление было неверным, поскольку вы явно указали версию API для Unicode, установив EntryPoint = "GetGlyphIndicesW", не указав кодировку символов и, следовательно, используя по умолчанию ANSI. Таким образом, вы получаете несоответствие Unicode / ANSI.

Самый простой способ решить эту проблему - изменить атрибут DllImport на

<DllImport("gdi32.dll", CharSet:=CharSet.Auto)> _
0 голосов
/ 20 августа 2009

Не могли бы вы попробовать это?

<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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...