Delphi XE2 での型変換(キャスト)について教えてください。
あるDLLに対して、
直接ファイルパスを渡した場合(タイプA)は答えが返ってきますが、
一度Stringに入れた物をPAnsiCharに変換(キャストと言うのでしょうか?)する
(タイプB)と、
答えが返ってきません。
これは、String型→PAnsiChar型への変換が
私が求めている結果を得ていないからだと思うのですが、
どのようにすれば、こちらの希望する形でファイルパスを渡せるのでしょうか?
ご指導、よろしくお願いいたします。
------------------------------------------------------
//宣言部
function GetNumber(var FileName:PAnsiChar):integer;
stdcall; external 'GetNum.dll';
//------------ タイプA:結果は良好
procedure TForm1.Button1Click(Sender: TObject);
var
begin
ShowMessage(IntToStr(GetNumber('C:\Project1.exe'));
end;
//------------ タイプB:結果無し
procedure TForm1.Button2Click(Sender: TObject);
var
s : String;
begin
s := 'C:\Project1.exe';
ShowMessage(IntToStr(GetNumber(PAnsiChar(s)));
end;
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
使い方はいろいろ♪一部のメンバーだけにMLメールを送ろう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=h8ugj
-----------------------------------------------------[freeml by GMO]--
maco さん:
> あるDLLに対して、直接ファイルパスを渡した場合(タイプA)は
> 答えが返ってきますが、一度Stringに入れた物をPAnsiCharに変換
> (キャストと言うのでしょうか?)する(タイプB)と、答えが返って
> きません。
>
> これは、String型→PAnsiChar型への変換が私が求めている結果を
> 得ていないからだと思うのですが、どのようにすれば、こちらの希望
> する形でファイルパスを渡せるのでしょうか?
お考えのとおりで、string 型から PAnsiChar 型へのキャストは
一発ではできません。
> procedure TForm1.Button2Click(Sender: TObject);
> var
> s : String;
> begin
> s := 'C:\Project1.exe';
> ShowMessage(IntToStr(GetNumber(PAnsiChar(s)));
> end;
この例でしたら、s の型を AnsiString にすればうまくいきます。
ご参考まで、PChar や PAnsiChar でのキャストでは、実際には
「文字配列の先頭アドレスを取得する」処理だけがなされます。
つまり PChar と PAnsiChar のどちらでキャストしても、結果は
同じなんです(使い方によってはコンパイル警告が出るかも
しれませんが、その程度の違いしかない)。 PAnsiChar で
キャストしたいなら、実際に Shift_JIS 文字の配列をメモリ上に
用意してあげないといけません。 これは AnsiString 型の
変数に代入することでできます。 よってお書きのコードは、次の
ように書いてもうまく動きます。
> procedure TForm1.Button2Click(Sender: TObject);
> var
> s : String;
sa : AnsiString;
> begin
> s := 'C:\Project1.exe'; {<====== Unicode 文字の配列ができる }
sa := s; {<======= ここで Shift_JIS 文字の配列ができる }
> ShowMessage(IntToStr(GetNumber(PAnsiChar(sa)));
> end;
――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
電子メール:tarou_...@imageom.co.jp
ホームページ:http://www.imageom.co.jp/
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
メンバーで使える掲示板を活用しよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=h8vQu
ご指導頂いた方法にて解決できました。
今までAnsiStringやPAnsiCharで行き詰まることが多かったのですが、
とてもわかりやすくご説明頂き、ようやくきっちりと理解できました。
これでまた一歩、Delphiのことを好きになれた気がします。
ありがとうございました。
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
メールだけでみんなを招待できる便利機能♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=h8xar