vb6 - 从 DLL res 文件中将希伯来语字符串读入 VB6
问题描述
我在 Visual Studio 2019 中创建了一个字符串资源 .RES 文件,其中包含多种语言的各种字符串表,然后我将 .RES 编译成一个 VB6 DLL(没有代码,VB6 项目只是一个编译后的 VB6 DLL)。这是创建 DLL 的无代码 VB6 项目:
然后我将这个 DLL 中的字符串读入一个 VB6 程序,并输出到一个支持 Unicode 的标签控件。
从英语和阿拉伯语中读取/输出的字符串很好,但对于希伯来语,它只显示相同的字符。
Option Explicit
Private Declare Function LoadString Lib "user32" Alias "LoadStringA" (ByVal hInstance As Long, ByVal wID As Long, ByVal lpBuffer As String, ByVal nBufferMax As Long) As Long
Private Declare Function LoadStringW Lib "user32" (ByVal hInstance As Long, ByVal wID As Long, ByVal lpBuffer As String, ByVal nBufferMax As Long) As Long ' Works Arabic
Private Declare Function SetThreadUILanguage Lib "kernel32" (ByVal dwLCID As Long) As Long
Private Declare Function SetThreadLocale Lib "kernel32" (ByVal dwLCID As Long) As Long
Private Sub Form_Load()
Dim hInst As Long, lResult As Long
Dim resstring As String
Dim icc As Long
Const STRLENGTH As Long = 1000
Const HEBREW As Long = 1037
Const ARABIC As Long = 3073
Const ENGLISH As Long = 1033
icc = ENGLISH ' convenience, set it once here
SetThreadUILanguage icc
SetThreadLocale icc
hInst = LoadLibrary("c:\temp\resstr.dll")
If hInst Then
resstring = String(STRLENGTH, Chr(0))
If icc = ENGLISH Then
lResult = LoadString(hInst, 101, resstring, STRLENGTH)
Label1.Caption = Left$(resstring, lResult)
Else
lResult = LoadStringW(hInst, 101, resstring, STRLENGTH)
Label1.Caption = StrConv(Left(resstring, lResult * 2), vbFromUnicode, icc)
End If
lResult = FreeLibrary(hInst)
End If
End Sub
如您所见,阿拉伯语输出很好(英语也很好,只是没有截屏)。但是...希伯来语打印出相同的字符?!
解决方案
您不能Declare
作为函数族的参数As String
。
VB6 会在调用 d 函数时自动将a转换为非 Unicode 程序的当前系统代码页,并在调用返回时转换回 Unicode。该机制旨在与处理 ANSI 的函数族交互。*W
String
Declare
*A
以这种方式调用*W
函数时,不仅Unicode数据会在你有机会执行之前被破坏StrConv(vbFromUnicode)
(你几乎不应该这样做,在这里它只会进一步破坏数据),而且你还有一个缓冲区溢出,您向函数承诺您提供了 1000 个字符的空间,而您只提供了 1000 个字节,这是一半。
为了调用*W
函数,您必须声明字符串缓冲区As Long
并传递StrPtr()
字符串变量。
你也不需要回退到LoadStringA
,因为它只不过是一个包装器LoadStringW
。
您的声明 forSetThreadUILanguage
也是错误的(LANGID
is a Integer
,而不是LCID
which is a Long
)。
Option Explicit
Private Declare Function LoadStringW Lib "user32" (ByVal hInstance As Long, ByVal wID As Long, ByVal lpBuffer As Long, ByVal nBufferMax As Long) As Long
Private Declare Function SetThreadUILanguage Lib "kernel32" (ByVal LangId As Integer) As Integer
Private Declare Function SetThreadLocale Lib "kernel32" (ByVal dwLCID As Long) As Long
Private Sub Form_Load()
Dim hInst As Long, lResult As Long
Dim resstring As String
Dim icc As Long
Const STRLENGTH As Long = 1000
Const HEBREW As Long = 1037
Const ARABIC As Long = 3073
Const ENGLISH As Long = 1033
icc = ENGLISH ' convenience, set it once here
SetThreadUILanguage icc
SetThreadLocale icc
hInst = LoadLibrary("c:\temp\resstr.dll")
If hInst Then
resstring = String(STRLENGTH, vbNullChar)
lResult = LoadStringW(hInst, 101, StrPtr(resstring), STRLENGTH)
Label1.Caption = Left$(resstring, lResult)
lResult = FreeLibrary(hInst)
End If
End Sub
推荐阅读
- python-3.x - macOS 上适用于 Python 3.7 的 Anaconda 2019.03 上的 Jupyter Notebook 中的内核错误
- google-apps-script - 脚本复制之前未保存 Google 表格数据
- java - 即使在调用 System.gc() 后 RAM 也不会清除
- php - 无法全局访问的无脂肪框架 SESSION 变量
- python - 如何避免使用“eval”函数循环遍历属性列表
- curl - 使用curl post将slurm sacct命令的终端输出写入influxdb?
- powershell - 我如何根据有输出文件的时间来衡量完成百分比?
- go - Why is a float64 type number throwing int related error in Go
- java - Android 得到 html 响应而不是 json 响应 | 价值
嗨,我很难弄清楚导致此错误的原因。直到我尝试使用调试并发现我得到的是 html 响应而不是 json 响应。请帮我解决这个问题。
检查这个java代码:
从这一点开始,错误被触发
- python - 修复了 Django 提供的默认值问题