2012-04-10 11 views
1

私はDelphi7とDelphiXE2(両方とも32ビット)を私のマシンにインストールしています。そして、私は関数libnodave.dllからopenSocket()を使う必要があります。DelphiXE2とDelphi7。 dllの動作は呼び出しプロセスに依存します

問題は、Delphi7とD7でコンパイルされた.exeファイルで、この関数は一瞬で実行され、整数値を返しますが、DelphiXE2では3秒間停止してゼロを返します。 私はD7の魔女の中にある種類の 'proxy-dll'を元のdllから同じ関数を内部的に呼び出すようにしましたが、うまくいきません。 今私は、プログラムの実行に関する他の情報がローカル関数のパラメータの他にdllに渡されることに興味があります。どのようにしてライブラリが機能を呼び出すかによって、その動作に差異を生み出すことができました。そして、D7コンパイラとして動作するようにDelphiXEコンパイラを設定する方法はありますか? もう少し小さな質問:デバッグ中にプログラムで定義されたすべてのグローバルパラメータ({$ DEFINE WIN32}など)を調べるにはどうすればよいですか?

ありがとうございました。

答えて

1

問題はDelphi7にし、D7でコンパイル.EXEファイルにこの 機能は一瞬で実行され、いくつかの整数値を返しますが、 DelphiXE2で、それは3秒(私は推測するタイムアウト)とリターンのために停止していることですゼロ。

openSocket()関数の宣言はどのように見えますか?呼び出し規約は両方のバージョンで一致しますか?関数にはStringのパラメータがありますか? StringはAnsi in D7で、UnicodeはDXE2であることを忘れないでください。関数が同じ呼び出し規約で宣言され、すべてのパラメーターが両方のバージョンで正しいデータ型で宣言されていることを確認してください。

私はプログラムの実行の他の情報がローカル関数のパラメータの他にdllに が渡されることに興味があります。

パラメータ値以外の関数には情報は渡されません。

D7コンパイラとして動作するDelphiXEコンパイラを設定する方法はありますか?

いいえ、XE2コンパイラをD7コンパイラのように動作させることはできません。

どのように私は(のような {$ WIN32を定義})プログラムで定義されているすべてのグローバルパラメータに目を通すことができますデバッグ中。

アクティブなコンパイラDEFINEをデバッグ時に表示する方法はありません。ただし、編集時には、キーボードショートカットCtrl + + があり、現在アクティブなDEFINEをソースコードに挿入します。

+0

これは 'Ctrl + O + O'ですが、' WIN32'や 'POSIX'は含まれていません。それは、警告、範囲チェックとオーバーフロー、最小列挙サイズ、そしてそのようなもの(IOW、あなたが変更できる定義であり、定数で構築されたものではない)を含みます。 –

+0

@KenWhite:情報ありがとう。 –

2

Delphi 7とXE2でdll関数を呼び出す間に違いはありません。 しかし、この関数はPChar型は、Delphi 7が、XE2でのUnicode(WideChar)でAnsiChar

function openSocket(port:longint;name:pchar):longint; stdcall; 
    external LibName {$ifdef WIN32} name 'openSocket'{$ENDIF}; 

として宣言しました。私はそれはまだ、このDLL内のAnsiCharのであるとすることができます推測することができます。名前はstring型である

  1. openSocket(で、yourPort、PAnsiChar(UTF8Encode(名)))(あなたは警告が表示されます)
  2. は、すべてのオカレンスの名前を変更しますnodave.pasのpcharからPAnsiCharの範囲にあり、とpcharの代わりにAnsiStringPAnsiStringを使用してください。
関連する問題