std::shared_ptr
メンバーとしてを持つクラスがあり、後で関数で初期化されます。ただし、デバッグしてshared_ptrオブジェクトのレイアウトを検査すると、内部ポインター(が指して<Unable to read memory>
いるクラス)を表示しようとすると表示されるため、正しく機能しているとは思いません。shared_ptr
以下の最初の 3 つのファイル スニペットは、2 番目のプロジェクトが参照する DLL プロジェクトのものです。IGLSLProgram.h ファイルがこの 2 番目のプロジェクトに含まれているため、DLL で定義されたエクスポートされたクラスを使用できます。
IGLSLProgram.h (DLL 内のインターフェース)
class IGLSLProgram;
typedef IGLSLProgram *GLSLProgramHandle;
typedef shared_ptr<IGLSLProgram> IGLSLProgramPtr;
extern "C" COMMON_API GLSLProgramHandle APIENTRY getGLSLProgram();
class IGLSLProgram {
public:
IGLSLProgram() {}
~IGLSLProgram() {}
// ...
virtual void release() = 0;
};
GLSLProgram.h (IGLSLProgram を実装)
#include "IGLSLProgram.h"
class GLSLProgram : public IGLSLProgram {
public:
GLSLProgram() {}
~GLSLProgram() {}
// ...
void release();
};
GLSLProgram.cpp (GLSLProgram 実装を定義)
#include "GLSLProgram.h"
COMMON_API GLSLProgramHandle APIENTRY getGLSLProgram() {
return new GLSLProgram;
}
// ...
Program.h (DLLを使用するプログラム)
#include "Common\IProgram.h"
#include "Common\IGLSLProgram.h"
class Program : public IProgram {
protected:
IGLSLProgramPtr shaderProgram;
public:
Program() {}
~program() {}
void createShaderProgram();
// ...
};
Program.cpp (Program.h で宣言されたクラスを定義)
#include "Program.h"
#include "Common\IGLSLProgram.h"
// ...
void Program::createShaderProgram() {
shaderProgram = IGLSLProgramPtr(getGLSLProgram(), mem_fn(&IGLSLProgram::release));
// ...
}
Program.cpp スニペットの最後の行を調べると、shaderProgram のレイアウトが次のようになっていることがわかります: http://i.stack.imgur.com/VZrkF.jpg
この問題に関するヘルプをいただければ幸いです。