1

まず第一に、間違いをお詫びします。英語は私の母国語ではありません。

ここに私の問題があります: CSocket から派生したクラスをエクスポートする DLL を作成しました。DLL を暗黙的にロードするクライアントが次のようにオブジェクトをインスタンス化する必要があることを除いて、すべて正常に動作します。

// Inside client constructor (client class scope object pointer)
CMyClass *m_lpMyObj = new MyClass;

ただし、オブジェクトが次のようにインスタンス化されている場合:

// Inside the client class header file (client class scope object)
CMyClass m_myObj;

クライアントを実行すると、次のエラーが表示されます。

Unhandled exception at 0x775015de in MyApp.exe: 0xC00000FD: Stack overflow.

クライアントメソッド内で私が書いた場合も同じ問題:

// Inside a client method (local object)
CMyClass myobj;

唯一の違いは、メソッドを呼び出すと (もちろん) エラーが発生することです。

クラスの詳細は次のとおりです。

// _AFXEXT defined for DLL project

#ifdef __cplusplus
extern "C" {
#endif

class CMyClass : public CSocket
{
  DECLARE_DYNCREATE(CModbusConnector)

public:
  AFX_EXT_CLASS CMyClass();  // Only some methods are exported
  AFX_EXT_CLASS virtual ~CMyClass();

  ....
};

#ifdef __cplusplus
}
#endif

DLL は CWinApp 派生オブジェクト (通常の DLL) です。DLL を拡張 DLL としてコンパイルしましたが、結果は同じでした。

前もって感謝します。

よろしく、

ニール

4

1 に答える 1

1

何が起こっているかはDECLARE_DYNCREATE、実行時にサイズが計算されるオブジェクトの場合だと思います。

あなたが言う時:

CMyClass *m_lpMyObj = new MyClass;

実際、インスタンスに必要なメモリを割り当てることができますが、次のように言うと:

CMyClass m_myObj;

コンパイル時の実際のサイズはなく、「スタブ」のサイズのみであるため、オブジェクトを使用しようとすると、割り当てられたスペースの終わりを超えて書き込みます。

于 2012-08-05T18:21:41.303 に答える