0

在 Windows 10 计算机上,我使用 PowerShell 脚本从第 4 维 (4D) 数据库调用 QuickBooks。该脚本调用QBXMLRP2.dll32 位 COM 对象与 QuickBooks 2019 对话。据我了解,如果您使用 64 位版本的 PowerShell 调用 32 位 dll,它将失败,反之亦然。但是,根据我使用的是 32 位还是 64 位版本的 4D,我会得到不同的结果。这对我来说毫无意义。这是我的测试结果:

OS  4D  PowerShell  DLL   Result
64  32  32          32    OK
64  32  64          32    OK //According to my research this should not work!

64  64  32          32    OK
64  64  64          32     X //According to my research this is the expected behavior

关于为什么 64 位版本的 PowerShell/32 位 dll 与 32 位版本的 4D 一起工作的任何想法?我真正想要的是让它与 64 位版本的 4D 和 PowerShell 一起工作。

回答问题...这就是我正在做的事情。4D 首先创建一个.ps1脚本文件并将其保存到磁盘,然后在外部进程中启动 PowerShell。例如,这将启动 64 位 PowerShell(Windows 10)并且 PowerShell 将执行之前保存的脚本:

"C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -file \""+$ScriptPath+"\""

PowerShell 脚本如下所示:

[String]$requestXML = '<?xml version="1.0" ?>
<?qbxml version="2.0"?><QBXML>
<QBXMLMsgsRq onError="stopOnError">
<CompanyQueryRq requestID="1">
</CompanyQueryRq>
</QBXMLMsgsRq>
</QBXML>'
$myQBXMLRP = New-Object -com QBXMLRP2.RequestProcessor
$myQBXMLRP.OpenConnection2("qb4D","CCFolioPro",1)
$ticket = $myQBXMLRP.BeginSession("C:\Company Files\Cadinha & Co.,LLC.QBW",$myQBXMLRP.qbFileOpenDoNotCare)
$myQBXMLRP.ProcessRequest($ticket, $requestXML) > $env:_4D_OPTION_OUTPUT_STREAM
$myQBXMLRP.EndSession($ticket)
$myQBXMLRP.CloseConnection()
"Stop" > $env:_4D_OPTION_STOP_TOKEN

据我了解,一旦 PowerShell 启动,4D 就不存在了。4D 不与 dll 交互。都是 PowerShell/dll (COM)/QuickBooks。

4

1 回答 1

0

在这个论坛的帮助和更多的研究下,我现在了解到,在 64 位 Windows 操作系统中,如果操作系统检测到 32 位应用程序正在调用 System32 目录,它会自动将调用重定向到 SysWow64 目录. 因此,在我的场景中,当从 32 位 4D 调用时,32 位 PowerShell 将始终运行。请注意,仅当调用应用程序在 64 位计算机上为 32 位时,此重定向才起作用。因此,如果 64 位应用程序 (4D) 在 System32 目录中调用 64 位 PowerShell,则不会发生重定向。在这种情况下,如果 PowerShell 调用 32 位 dll,它将失败。PowerShell/dll 必须匹配位数。

如果想强制 System32 目录中的 64 位版本从 32 位应用程序运行,可以使用特殊的“Sysnative”目录代替 System32 目录。请注意,这是一个虚拟目录。您不会在文件系统中找到它。同样,如果您确实强制使用 64 位 Powershell 并且 PowerShell 尝试调用 32 位 dll,它将失败。

下面的文章是一个很好的阅读...

https://docs.microsoft.com/en-us/windows/desktop/winprog64/file-system-redirector

这是我更正后的测试图表...

OS  4D  PowerShell  DLL   Result
64  32  32          32    OK
64  32  64-OS->32   32    OK //OS redirected to 32bit PS. Expected behavior!

64  64  32          32    OK
64  64  64          32     X //No redirect. Expected behaviour
于 2019-06-06T07:50:57.040 回答