在Windows 10计算机上,我正在使用PowerShell脚本从4维(4D)数据库调用QuickBooks。该脚本调用QBXMLRP2.dll(一个32位COM对象)与QuickBooks 2019进行通信。据我了解,PowwerShell,使用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首先创建ps脚本文件并将其保存到磁盘,然后在外部进程中启动PowerShell。例如,这将启动64位PowerShell(windows10),而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。
答案 0 :(得分:0)
有了这个论坛的帮助和更多的研究,我现在知道在64位Windows操作系统中,如果操作系统检测到32位应用程序正在对System32目录进行调用,它将自动将调用重定向到SysWow64目录。因此,在我的场景中,当从32位4D调用时,PowerShell将始终运行。请注意,仅当调用应用程序是64位计算机上的32位时,此重定向才起作用。因此,如果64位应用程序(4D)在System32目录中校准了64位PowerShell,则不会发生重定向。在这种情况下,如果PowerShell调用了32位dll,它将失败。 PowerShell / dll必须匹配位数。
如果要强制从32位应用程序运行System32目录中的64位版本,则可以使用特殊的“ 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