Помогите сделать перекодировку
Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" _
(ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Option Explicit
Private Sub cmdStart_Click()
Dim sSource As String
Dim sDestination As String
Dim lReturn As Long
SSource=”Текст в кодировке DOC”
lReturn = OemToChar(sSource, sDestination)
txtTest.Text = sDestination
End Sub
После визова этой функции в переменную sDestination должен возвращатся перекодированый текст, но она остается пустой, почему? Что я неправильно делаю?
Кто подскажет как можно перекодировать текст из DOC в Windows. Я использовал API фуркцию:
Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" _
(ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Option Explicit
Private Sub cmdStart_Click()
Dim sSource As String
Dim sDestination As String
Dim lReturn As Long
SSource=”Текст в кодировке DOC”
lReturn = OemToChar(sSource, sDestination)
txtTest.Text = sDestination
End Sub
После визова этой функции в переменную sDestination должен возвращатся перекодированый текст, но она остается пустой, почему? Что я неправильно делаю?
Тут вот такая тонкость, а может и глюк.
Ф-ция OemToCharA не может менять размер строки sDestination. Поэтому либо пиши
lReturn = OemToChar(sSource, sSource)
либо задай длину sDestination равной sSource (можно просто sDestination=sSource )
работает
Тут вот такая тонкость, а может и глюк.
Ф-ция OemToCharA не может менять размер строки sDestination.
Тонкость заключается в различии понятия строки в VB и WinAPI. Никаких глюков.
lReturn = OemToChar(sSource, sSource)
С точки зрения распределения памяти изменение исходной строки будет работать быстрее. Код Windows API в этом случае работает безопасно по отношению к вызывающей программе.
Тонкость заключается в различии понятия строки в VB и WinAPI. Никаких глюков.
lReturn = OemToChar(sSource, sSource)
С точки зрения распределения памяти изменение исходной строки будет работать быстрее. Код Windows API в этом случае работает безопасно по отношению к вызывающей программе.
Лично для меня несколько странно, что API функция с параметром в Declare ByVal sDestination As String что-то может изменять. Понятно, что волшебство в Declare. Я часто заменяю декларацию, выдаваемую API Viewer на то, что более соответствует сигнатуре API функции - на адрес памяти: ByVal lpDestination As Long, ну и соответственно использую VarPtr(), StrPtr(). Конечно, это не всегда хорошее решение. Как говориться, будь проще - будет лучше.
Лично для меня несколько странно, что API функция с параметром в Declare ByVal sDestination As String что-то может изменять. Понятно, что волшебство в Declare. Я часто заменяю декларацию, выдаваемую API Viewer на то, что более соответствует сигнатуре API функции - на адрес памяти: ByVal lpDestination As Long, ну и соответственно использую VarPtr(), StrPtr().
Ну, это уже чисто бейсиковские приколы. Хотели сделать как лучше, а получилось как всегда.