64位的PowerShell调用32位的DLL。

问题描述 投票:0回答:1

在 Windows 10 计算机上,我使用 PowerShell 脚本从第 4 维 (4D) 数据库调用 QuickBooks。该脚本调用了 QBXMLRP2.dll,一个32位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位版本的PowerShell32bit 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交互。都是PowerShelldll(COM)QuickBooks。

powershell dll com quickbooks 4d-database
1个回答
0
投票

通过这个论坛的帮助和更多的研究,我现在明白了,在64位的windows操作系统中,如果操作系统检测到一个32位的应用程序正在对System32目录进行调用,它会自动将调用重定向到SysWow64目录。因此,在我的方案中,32位PowerShell在从32位4D调用时将始终运行。需要注意的是,这个重定向只有在64位机器上调用的应用程序是32位时才会发挥作用。因此,如果一个64位的应用程序(4D)调用System32目录下的64位PowerShell,重定向将不会发生。在这种情况下,如果一个32位的dll被PowerShell调用,它将失败。PowerShelldll必须匹配位性。

如果想强制System32目录下的64bit版本从32bit应用程序中运行,可以使用特殊的 "Sysnative "目录来代替System32目录。注意,这是一个虚拟目录。你不会在文件系统中找到它。再次强调,如果你强制使用64位的Powershell,而PowerShell试图调用一个32位的dll,它将失败。

下面的文章是一篇非常好的读物......

https:/docs.microsoft.comen-uswindowsdesktopwinprog64file-system-redictor

这是我改正后的测试图... ...

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
© www.soinside.com 2019 - 2024. All rights reserved.