[delphi-users:2339] String型→PAnsiChar型への変換 [Delphi XE2]

334 views
Skip to first unread message

maco

unread,
Nov 22, 2011, 1:55:49 AM11/22/11
to delphi...@freeml.com
maco と申します。

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]--

高木太郎

unread,
Nov 22, 2011, 3:33:07 AM11/22/11
to delphi...@freeml.com
こんにちは、イマジオムの高木です。

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

maco

unread,
Nov 22, 2011, 4:32:46 AM11/22/11
to delphi...@freeml.com
高木さん

ご指導頂いた方法にて解決できました。

今までAnsiStringやPAnsiCharで行き詰まることが多かったのですが、
とてもわかりやすくご説明頂き、ようやくきっちりと理解できました。
これでまた一歩、Delphiのことを好きになれた気がします。

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

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メールだけでみんなを招待できる便利機能♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=h8xar

Reply all
Reply to author
Forward
0 new messages