gpt4 book ai didi

excel - 在 64 位办公室调用 MultiByteToWideChar() 给出错误结果

转载 作者:行者123 更新时间:2023-12-04 22:21:55 26 4
gpt4 key购买 nike

我有一个 Excel VBA 项目,我正在适应 64 位 Office。一方面,我调用 MultiByteToWideChar()使用 20 个左右不同的代码页中的任何一个。 (所以 StrConv 不是替代品。)

这在 32 位 Office 中为我工作了多年,使用以下 declare :

Declare Function MultiByteToWideChar Lib "kernel32" ( _
ByVal codepage As Long, _
ByVal dwFlags As Long, _
lpMultiByteStr As Any, _
ByVal cbMultiByte As Long, _
ByVal lpWideCharStr As Long, _
ByVal cchWideChar As Long _
) As Long
'params: UINT, DWORD, LPCSTR, int, LPWSTR, int
'return: int

但我对 64 位的适应不是:我得到了错误的结果(例如,一个空字符串,其中需要一个非空字符串),并且经常崩溃。我正在使用 declare我从 Microsoft-provided Win32API_PtrSafe.TXT file 得到的. (当然,它可能有错误。)

所以,我猜想在声明语句或我的调用方式中有些地方不对劲。

这是重现的最小样本:

'Windows API declarations

Public Const MB_PRECOMPOSED = &H1 'use precomposed chars

Declare PtrSafe Function MultiByteToWideChar Lib "kernel32" ( _
ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpMultiByteStr As String, _
ByVal cchMultiByte As Long, _
ByVal lpWideCharStr As String, _
ByVal cchWideChar As Long _
) As Long
'params: UINT, DWORD, LPCSTR, int, LPWSTR, int
'return: int


' My function that calls MultiByteToWideChar

Private Function EncodedStringByteArrayToString(abStringData() As Byte, lngArrLen As Long, CodePage As Long) As String
Dim lngStrLen As Long, str As String

lngStrLen = MultiByteToWideChar(CodePage, MB_PRECOMPOSED, ByVal VarPtr(abStringData(1)), lngArrLen, 0&, 0)
str = String(lngStrLen, " ")
lngStrLen = MultiByteToWideChar(CodePage, MB_PRECOMPOSED, ByVal VarPtr(abStringData(1)), lngArrLen, StrPtr(str), lngStrLen)
EncodedStringByteArrayToString = str
End Function


' Sample routine to produce repro

Private Sub TestMB2WCBug()
Dim abStringData(1 To 9) As Byte
Dim resultString As String

abStringData(1) = 67
abStringData(2) = 111
abStringData(3) = 112
abStringData(4) = 121
abStringData(5) = 114
abStringData(6) = 105
abStringData(7) = 103
abStringData(8) = 104
abStringData(9) = 116

resultString = EncodedStringByteArrayToString(abStringData(), 9, 10000)
End Sub

最佳答案

This has been working for me for years in 32-bit Office



它不可能与 Declare 一起使用你已经证明了。
MultiByteToWideChar预计 LPWSTR作为输出缓冲区。 VB 在将字符串传递到 Declare 时执行从 Unicode 到 ANSI 的自动转换d 函数,因此当 lpWideCharStr 时,该函数无法接收指向宽字符串缓冲区的指针。声明为 As String .充其量,它会接收一个足够大的缓冲区,因此不会发生缓冲区溢出,然后 VB 在从函数返回时执行转换回 Unicode,因此您最终会得到一个双 unicode 字符串。
lpMultiByteStr也不是字符串,它是 some encoding 中的字节数组.
EncodedStringByteArrayToString里面的代码似乎知道这一切,因为它正确传递了 lpMultiByteStr 的字节数组和 StrPtr对于 lpWideCharStr .这可能不会发生在 MultiByteToWideChar 的当前声明中。 .
EncodedStringByteArrayToString 中的代码假定的声明是:

Declare PtrSafe Function MultiByteToWideChar Lib "kernel32" ( _
ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpMultiByteStr As LongPtr, _
ByVal cchMultiByte As Long, _
ByVal lpWideCharStr As LongPtr, _
ByVal cchWideChar As Long _
) As Long

显然你以前有过,所以把它放回去。

关于excel - 在 64 位办公室调用 MultiByteToWideChar() 给出错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62125968/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com