如何在 VB6 应用程序中处理 DLL 错误消息的 encoding/localization?

How the encoding/localization of a DLL error message is handled in a VB6 application?

(更新: 这个问题在更好地理解发生了什么之后得到更新,我删除了嘈杂的错误部分。)

这段代码属于COM DLL。对于上下文,它包含一个在经典 ASP 页面中创建和处理的 ActiveX 对象。

Public Function getHttpResponse(url As String)
  Dim request As New WinHttpRequest
  
  On Error GoTo errGetHttpResponse
  request.Open "HEAD", url
  request.Send
  getHttpResponse = request.Status
  Exit Function
  
errGetHttpResponse:
  getHttpResponse = Err.Description
End Function

Err.Description 字符串本地化和编码似乎依赖于 运行ning 环境。对于错误 80072EE5,我得到 Err.Description(从加载 DLL 的可执行文件的 GUI 检索):

值得注意的是撇号不一样。

调用和显示 ActiveX 输出的 ASP 页面可以这样简化:

Session.LCID=1036 ' French identifier (global.asa file)
Dim o : Set o = CreateObject("TheDLL.TheObject")
Response.Write o.getHttpResponse(anInvalidUrl)

虽然如果 运行 从机器 1 中它可以正确呈现,但从机器 2 中撇号被隐藏(在 Firefox 上查看源代码显示 00 92 方形字符)。机器 2 生成的 HTML 转载如下:

00000000  4c 92 55 52 4c 20 6e 92  65 73 74 20 70 61 73 20  |L.URL n.est pas |
00000010  76 61 6c 69 64 65                                 |valide

撇号被编码为 0x92,这是 RIGHT SINGLE QUOTATION MARKISO-8859-1.

中的编码

如何解释差异?并且可以选择是否有一种方法可以设置独立于平台的输出?

(是的,这是一个即将消亡的遗留代码。)

在评论区与 Remy Lebeau 和 GSerg 进行了深入讨论后,以下是理解差异的关键:

  • VB6 以 UTF-16 格式处理字符串,但它们的输出方式取决于上下文
    • 本地化
    • Response.Charset and Session.Codepage for ASP pages, or default values 如果没有指定
    • (各种 IO/GUI 机制)
  • 错误消息可能因实现而异(这可以解释为什么撇号从 L'URL 更改为 L’URL