サードパーティの企業から提供された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で動作させることはできますか?
それは本当にすべてのコードですか? 2000文字で十分だとどう思いますか? –
DLLを提供した会社はDLLの呼び出し方法を示したサンプルDelphiアプリケーションを提供しました。彼らは2000文字でそれを定義したものでした。また、「結果変数バッファは、関数を呼び出す前に最低2000バイトに事前に割り当てる必要があります」という説明書も用意されています。 –
示されている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エラーは何と言いますか?あなたはまだそれをデバッグしようとしましたか? –