2

Delphi で開発された dll の機能を使用できません。型の変換に問題があります。

これは、DLL を呼び出したい関数です。

function rData(ID: Cardinal; queue: WideString): WideString; stdcall;

C ++での私のコードはそうでした:

typedef string (*ReturnDataSPL)(DWORD, string);

string result;
HMODULE hLib;
hLib = LoadLibrary("delphi.dll");
pReturnDataSPL = (ReturnDataSPL)GetProcAddress(hLib,"rData");
if (NULL != pReturnDataSPL)
   result = pReturnDataSPL(JobID,printerName);

私はそれを機能させることができない問題。Delphi WideString や Cardinal と互換性のある型がわかりません。

誰か助けて

編集:

これは、DLL を呼び出したい関数です。

procedure rData(ID: Cardinal; queue: WideString; var Result: WideString); stdcall;

コードを変更すると、次のようになります。

typedef void (__stdcall *ReturnDataSPL)(DWORD, BSTR, BSTR&);

HMODULE hLib;
BSTR result = NULL;
hLib = LoadLibrary("delphi.dll");

pReturnDataSPL = (ReturnDataSPL)GetProcAddress(hLib,"rData");
if (NULL != pReturnDataSPL)
{
   pReturnDataSPL(JobID,(BSTR)"Lexmark X656de (MS) (Copiar 2)",result);
}
4

1 に答える 1

11

その関数を呼び出す機会はほとんどありません。

stringまず、あなたの現在のコードは成功するとは思えませんstd::string。これは、Delphi コードが提供も消費もできない C++ データ型です。Delphi と比較するには、COMデータ型WideStringを使用する必要があります。BSTR

現状のコードのもう 1 つの問題はcdecl、C++ 側とstdcallDelphi 側で使用されていることです。呼び出し規約を調整する必要があります。

ただし、Delphi の戻り値の ABI とプラットフォーム標準の違いにより、これも失敗します。このトピックについては、こちらで詳しく説明しています: WideString を相互運用のための関数の戻り値として使用できないのはなぜですか?

最善の策はWideString、戻り値として使用するのをやめて、C++ 参照パラメーターに変換することです。Delphi を一致するように変換する必要があります。

あなたはこのようなものを見ています:

デルファイ

procedure rData(ID: Cardinal; queue: WideString; var Result: WideString); stdcall;

C++

typedef void (__stdcall *ReturnDataSPL)(DWORD, BSTR, BSTR&);
于 2013-04-02T14:47:53.070 に答える