Windows 10 コンピューターで、PowerShell スクリプトを使用して 4th Dimension (4D) データベースから QuickBooks を呼び出しています。スクリプトはQBXMLRP2.dll
、32 ビット COM オブジェクトである を呼び出して、QuickBooks 2019 と通信します。私が理解しているように、64 ビット バージョンの PowerShell を使用して 32 ビット dll を呼び出すと失敗し、その逆も同様です。ただし、4D の 32 ビット バージョンと 64 ビット バージョンのどちらを使用するかによって、異なる結果が得られます。これは私には意味がありません。ここに私のテスト結果があります:
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 で動作する理由について何か考えはありますか? 私が本当に望んでいるのは、4D と PowerShell の 64 ビット バージョンで動作することです。
質問に答えて... これが私がやっていることです。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 です。