こんにちは、
最初に Delphi だけでなく C++Builder の両方についての
質問になり恐縮ですが、
目的:呼び出し側を Delphi で作成し、DLL側を C++Builder で作成します。
理由:C++Builder の処理コンポーネントを使用したいのですが、
Delphi に簡単に移植できないので、C++Builder で
DLL を作成して、このコンポーネントで処理した結果のデータを
利用すれば・・・と思ったのですけど、うまくいきません。
何か考え違いしているのかもしれませんので教えてください
以下が現状のプログラムのコードです。
よろしくお願いします.
≡≡≡≡≡
Delphi 側
≡≡≡≡≡
function FLoad(Fname: PChar; MStream: TMemoryStream): Boolean; stdcall; external 'DLLTest.dll' name 'FileLoad';
:
implementation
:
procedure TForm1.Button1Click(Sender: TObject);
var
FileName: String;
begin
MStream := TMemoryStream.Create;
try
if OpenDialog.Execute then begin
FileName := OpenDialog.FileName;
MStream.Position := 0;
FLoad( PChar(FileName), MStream);
RichEdit.Text := 'Size = ' + IntToStr(MStream.Size);
end;
finally
MStream.Free;
end;
end;
≡≡≡≡≡≡≡
C++Builder側
≡≡≡≡≡≡≡
extern "C" __declspec(dllexport) bool __stdcall FileLoad(PChar FName, TMemoryStream *MStream);
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
bool __stdcall FileLoad(PChar FName, TMemoryStream *MStream)
{
try {
MStream->LoadFromFile( FileName );
return( true );
} catch (...) {
return( false );
}
}
DLL とそれを呼ぶ EXE との間でクラスのインスタンスを受け渡しすることは
できません。
TMemoryStream のインスタンスを受け渡ししたいなら、インスタンスそのものでは
なく、それが保持している MStream.Memory のポインタとサイズを受け取れば
いいと思います。
MLで答えが出れば良いですね。
>調査の結果
>『DLL と EXE 間ではクラスのインスタンスの受け渡しができない。』
>ようです。
なんか悪質だな
ひとことコトワリ入れておけばいいのに
にしても、ここよりMLのほうがマシだってことかよ。
どうでもいいが、回答者の時計が昨日から狂いっぱなし。読みづらい
↑
あ、同じこと書こうと思ったら先こされてた。
>調査の結果
>『DLL と EXE 間ではクラスのインスタンスの受け渡しができない。』
マルチを「調査」と称するその厚顔さにはあきれるばかりです。
時計直せよ。
どうでもいいが、ローカル変数を関数の返り値にするなよ。
ML に行ってしまったんですよね? そうですか・・・・
> ポインタとサイズを受け取ればいいと思います。
じゃ、この例はいりませんね。
先生に言われるまで納得しないなら、最初からMLにしとけばいいのにね。
ここの回答者は信用ないのね。
ツイート | ![]() |