在 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 位版本的 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。