2016-08-11 4 views
0

サードパーティの企業から提供されたDLLがあり、Delphi 2007から呼び出されたときに正常に動作しました。次のコードは、DLLはDelphi(デルファイ)2007年に使用されたかのサンプルです:ここでDelphi XE5からの呼び出し時に、ユニコード前コンパイルされたDLLがアクセス違反を与える

Procedure XC_eXpressLink(hHandle: Hwnd; Parameters: pChar; Result: pChar); stdcall; external 'XCClient.dll'; 

は、プロシージャが呼び出された方法です。

procedure TForm1.Button1Click(Sender: TObject); 
    var Result: array[0..2000] of char; 
    sParams: String; 
begin 
    sParams := RemoveCRLF(memoParameters.Text); //Remove TMemo CR/LF 
    XC_eXpressLink(Handle, pChar(sParams), Result); 
    memoResults.Text := String(Result); 
end; 

私は、DLLがでコンパイルされたかわからないんだけど、私はそれがansiとunicodeを期待していると仮定しています。次のようにデルファイXE5にANSIにコードを変換した後、コードは次のようになる:

Procedure XC_eXpressLink(hHandle: Hwnd; Parameters: pAnsiChar; Result: pAnsiChar); stdcall; external 'XCClient.dll'; 

procedure TForm1.Button1Click(Sender: TObject); 
    var Result: array[0..2000] of Ansichar; 
    sParams: AnsiString; 
begin 
    sParams := RemoveCRLF(memoParameters.Text); //Remove TMemo CR/LF 
    XC_eXpressLink(Handle, pAnsiChar(sParams), Result); 
    memoResults.Text := AnsiString(Result); 
end; 

memoParameters DLLプロシージャのパラメータを提供する形にTMemoオブジェクトです。 RemoveCRLFは、memoParametersからのキャリッジリターンと改行を削除する関数です。 MemoResultsは、dllプロシージャの戻り値を提供するフォーム上の別のTMemoです。

変更されたコードがDelphi XE5で実行されるとアクセス違反が発生します。私はansiを使用するためにすべてのパラメータを変更したので、dllは以前と同じパラメータフォーマットを取得すべきではありませんか?私は何か間違っているのですか?この古いコンパイル済みDLLをDelphi XE5で動作させることはできますか?

+0

それは本当にすべてのコードですか? 2000文字で十分だとどう思いますか? –

+0

DLLを提供した会社はDLLの呼び出し方法を示したサンプルDelphiアプリケーションを提供しました。彼らは2000文字でそれを定義したものでした。また、「結果変数バッファは、関数を呼び出す前に最低2000バイトに事前に割り当てる必要があります」という説明書も用意されています。 –

+0

示されているAnsi変換コードは技術的に正しいですが、AccessViolationを引き起こすべきである間違いはありません** IF ** 1)DLLがバッファオーバーフローしていない、そして2)バッファ出力は常にNULLで終了しています。一方、XE5で 'XC_eXpressLink()'の使用に関連してAccessVioationが報告されたのは今回が初めてではありません([this](http://www.codenewsfast.com/cnf/thread/1606749003/permalink)参照)。 .thr-ng1909q22754)と[this](http://www.devsuperpage.com/search/Articles.aspx?G=2&ArtID=91383))。 *実際のAVエラーは何と言いますか?あなたはまだそれをデバッグしようとしましたか? –

答えて

0

X-Charge(クレジットカードの統合用)用のDLLを提供するOpenEdgeに問い合わせました。この問題を解決するには、ハンドルの値がであり、dllに送信されるパラメータリストに/IGNOREHANDLEPARAMETERを追加する必要があります。このパラメータは、完全版XC8.1.1.6.exeのインストール以降でのみ機能します。

procedure TForm1.Button1Click(Sender: TObject); 
    var Result: array[0..2000] of Ansichar; 
    sParams: AnsiString; 
begin 
    sParams := RemoveCRLF(memoParameters.Text); //Remove TMemo CR/LF 
    XC_eXpressLink(0, pAnsiChar(sParams), Result); 
    memoResults.Text := AnsiString(Result); 
end; 
関連する問題