とあるサンプルプログラムがXE3では正しく動作しません

解決


山西  2013-04-12 20:13:19  No: 44284

Memory.dll
http://www.vector.co.jp/soft/win95/prog/se358509.html
こちらに付属しているDelphiのサンプルプログラムが、Delphi 6 Personalでは正しく動作するのですが、XE3でコンパイルすると起動はするのですがうまく動作しません。

XE3は体験版を使用しているのですがそれが原因でしょうか?

それともどこか書き換える必要があるのでしょうか?

よろしくお願い致します。


au  2013-04-12 22:10:09  No: 44285

PCharと定義されてるものをPAnsiCharに変えてみたらどうでしょ


Mr.XRAY  URL  2013-04-13 01:06:33  No: 44286

>PCharと定義されてるものをPAnsiCharに変えてみたらどうでしょうか?

ちょっと興味があり,やってみました.

(1) http://www.vector.co.jp/soft/win95/prog/se358509.html
    からダウンロードしたファイルを解凍
(1) [サンプル集] の sampleについて.txt に書いてある 
    うさみみハリケーンをダウンロードしようとしたが,よくわからないので,
    インターネットで検索し,以下からダウンードして解凍  
    http://www.vector.co.jp/soft/win95/prog/se375830.html 
(2) [Delphi] [Sample] の Project1.dpr を起動 
    下のコードに修正してコンパイルしたら,IDE を閉じる
    
(3) UsaTest2.EXE を起動
    これは,任意のフォルダからの起動で OK
(4) [Sample] のテストプログラム Project1.exe を起動
(5) 読み込み,書き込みができることを確認
(6) UsaTest2.EXE 側での変更も取得できることを確認

おそらく,作成した DLL が Ansi版で出来ているのではないかと思われます.

function ReadMemory(pname:PAnsiChar ; adr:DWORD ; var rdata:DWORD ; size:DWORD):Integer;stdcall;external 'Memory.dll';
function WriteMemory(pname:PAnsiChar ; adr,wdata,size:DWORD):Integer;stdcall;external 'Memory.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
pname: PAnsiChar;
adr,rdata,size:DWORD;
begin

    pname := 'UsaTest2.EXE';
    adr := $00402148;
    size := 2;
    if (ReadMemory(pname,adr,rdata,size) = 0) then
        Edit1.Text := '読み込み失敗'
    else
        Edit1.Text := IntToStr(rdata);

end;

以下,同様に PAnsiChar に修正.
もしかしたら,

var
  pname : AnsiString にして,
  ReadMemory(PAnsiChar(pname),adr,rdata,size)  
  
  のようにした方がいいかも知れません.
  
動作確認は,Windows 7 U64(SP1) + Delphi XE pro と Delphi XE3(UP1) Pro VCL-32 です


山西  2013-04-13 09:03:01  No: 44287

au様、的確な解答ありがとうございます。
Mr.XRAY様、具体例等、詳しくありがとうございます。

お二方のお陰でうまく動作させる事が出来るようになりました。
本当に助かりました。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加