2017-06-20 7 views
0

DbkDebug240.bplからいくつかの関数をIDEプラグインにフックしています。
フックは正常に機能しますが、いくつかの文字列データを使用する必要があります。BorlndMM.dllを使用しないDLLから文字列を使用するには

問題は、DbkDebug*.bplはShareMemを使用していません。つまり、BorlndMM.dllはインポートされません。これは、文字列を返す関数を呼び出すために問題が発生しますが、例外を発生させることなくこれを行うことはできません。
これを横向きにして修正することができます(つまり、PCharを使用します)が、リークが発生します。

例:

function GetExceptionMessage: Unicodestring; external 'Dbk240.bpl' 
    name '@[email protected]@GetExceptionMessage$qqrv'; 
//causes exceptions further down the line. 

function GetExceptionMessage: PChar; external 'Dbk240.bpl' 
    name '@[email protected]@GetExceptionMessage$qqrv'; 
//I think this causes a leak futher down the line. 

が漏れないように、ShareMemを使用していないDLLから文字列を返す関数を呼び出す方法はありますか?

問題は、私のプラグインがDLLにあることです。私はDLLのメモリマネージャの機能をIDEのものに引っ掛けて問題を解決できると思う。

答えて

3

これはパッケージですので、ShareMemを使用する必要はありません。代わりに、ランタイムパッケージにリンクして、rtlパッケージにリンクしていることを確認してください。あなたのコードはrtlパッケージにリンクしているので、メモリアロケータを含め、ランタイムを自然に共有します。

私は、DLLのメモリマネージャの機能をIDEのものにフックして問題を解決できると思います。

これは間違った方法です。ランタイムパッケージとのDLLリンクを手配するだけで済みます。

+0

dbkdebugをパッケージに含めることはできません。これには.dcpファイルはありません。だから私は何をすべきか分からない。 – Johan

+0

私はここにDLLがないことに注意してください。私が見るのはパッケージからのいくつかの機能だけです。私はあなたのプログラムの構造が何であるかという概念を持っていません。私はあなたがパッケージで作業しているときにDLLを参照する理由を理解していません。私たちの視点から物事を想像してみてください。私はこのページで見ることができるものがあります。私が言うことは、パッケージはShareMemを使用せず、むしろrtlパッケージの使用を共有することによって、メモリマネージャを共有するということです。だからあなたはどこにでもShareMemを持ってはいけません。 –

+0

OK、どこでもShareMemを削除してください。私のコードはDLLに入っていても、私はRTLパッケージにリンクしています。あれは正しいですか? – Johan

関連する問題