1

文字列を渡して文字列を取得できる DLL を作成するために 2 週間試しています。しかし、まだ成功していません。

Dev-C++(TDM-GCC 4.9.2) と Visual Studio community 2015 でこれを試しました。これについてよく検索し、見つけたほとんどすべてのサンプル コードを試しましたが、成功しませんでした。

この DLL をMetaTrader Terminal 4で使用する必要があります。
これが私が使用した1つのサンプルコードです。このコードは正常にコンパイルされますが、MT4stringからこれにを送信すると、アクセス違反エラーが発生します。

#ifndef MYLIB_HPP
#define MYLIB_HPP

#include <string>

#ifdef MYLIB_EXPORTS
#define MYLIB_API __declspec(dllimport) 
#else
#define MYLIB_API __declspec(dllexport) 
#endif
bool MYLIB_API test(const std::string& str);
#endif

bool MYLIB_API MyTest(const std::string& str)
{
    return (str == "Hi There");
}
4

3 に答える 3

2

stringDLL と別の実行可能ファイルの間でC++ を共有する場合は、両方が同じツール チェーンでコンパイルされている必要があります。これは、std::stringがヘッダーのみで定義されているためです。そのため、DLL と実行可能ファイルが異なるstringヘッダーを使用している場合、それらはバイナリ非互換である可能性があります。

さまざまなツールチェーンで動作することを確認したい場合は、NULL で終了する C 文字列に固執してください。

于 2016-12-10T10:42:05.467 に答える
0

ほとんどの場合、コードとリンク先のコードは、異なる ABI でコンパイルされています。std::stringつまり、ライブラリで使用される文字列のメモリ レイアウト (およびsizeof) は、コンパイルしたものとは異なります。

hdf5ライブラリにリンクしてgccを使用しているときに、この問題に遭遇したことがあります。この場合、こちらで説明されているように、以前の ABI に戻すことで問題を解決できます。

ただし、そのような解決策が利用できない場合、問題はclangでも発生しました。したがって、これをすべて機能させるにstd::stringは、別の ABI でコンパイルされたライブラリ (私の場合は hdf5) への呼び出しでの使用を避け、代わりにconst char*.

于 2016-12-10T10:57:01.813 に答える