0

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

この問題に関するヘルプをいただければ幸いです。

4

1 に答える 1