2

次のプロトタイプの dll を取得しました。

DLL_EXPORT std::list<std::wstring>* c_ExplodeWStringToList(std::wstring in_delimiter, std::wstring in_string, int in_limit);

アプリケーションはこれを次のように使用します。

std::list<std::wstring>* exploded = mydllclass->c_ExplodeWStringToList(L" ", in_command.c_str(), 0);

これは XP 32 では問題なく動作しますが、自宅で Vista 64 でこれを試すと、プログラムが閉じてしまいます。エラーも警告もありませんか?

数日前、DLL はリストを直接返していました - ポインターはありません。しかし、VC++ 2010 Express に切り替えたところ、この変更なしでは DLL をコンパイルできませんでした。

ここに表示されていないものはありますか?

ありがとうございました :)

アップデート:

DLL_EXPORT std::list<std::wstring>* c_ExplodeWStringToList(std::wstring in_delimiter, std::wstring in_string, int in_limit)
{
 std::list<std::wstring>* returnlist = new std::list<std::wstring>();
 std::list<std::wstring>* stringlist = new std::list<std::wstring>();
 UINT pos = 0;

 while(true)
 {
      pos = in_string.find(in_delimiter, 0);

      if(pos == std::string::npos)
      {

           stringlist->push_back(in_string.substr(0, pos));
           break;
      }
      else
      {

           stringlist->push_back(in_string.substr(0, pos));
           in_string = in_string.substr(pos + in_delimiter.length());
      }
 }

 // ****
// Here is missing some code I've commented out while searching for the error.
 // ****
returnlist = stringlist;

return returnlist;
}

T

4

1 に答える 1

0

コードを掘り下げることはしませんでしたが、DLL の操作に関して到達した結論は、DLL 関数からプリミティブ型以外は何も返さないということです。これは、異なるコンパイラ、異なるスイッチ、またはプロジェクト設定が原因で、構造体とクラスが整列されておらず、DLL 内と DLL を呼び出すコード内で同じサイズを持っていないためです。

そのため、DLL からリストを返すことは、呼び出し元のアプリケーションで不正な形式と見なされる可能性があります。

DLL からの例外のスローに関しても同じことが言えます。スローされたクラスは、キャッチ コードによって誤って解釈される可能性があります。

したがって、(エラー コードを示すために) プリミティブ型を返す C 関数のみをエクスポートするのが最善です。

于 2012-12-06T19:54:21.817 に答える