0

私には2つのモジュールがあり、それぞれに独自のクラスと独自のオブジェクトがあります。各モジュールはDLLにコンパイルされます。別のクラスのオブジェクトへのポインタを持つ「クロスDLL」メソッド呼び出しを行いたいのですが、リンカはこれを許可していません(MSVC ++2008)。

すなわち:

  • calledClassを持つcalledModule.cppと、このクラスのオブジェクト(calledObject)があります。クラスは、私が呼び出したいメソッドを呼び出しました。モジュールはDLLにコンパイルされ、Lib.dllと呼ばれるようになります(驚きです!)。
  • callingClassを持つcallingModule.cppがあります。特に、クラスには、calledObjectへのポインタである属性があります。モジュールはDLLcallingLib.dllにコンパイルされます。calledObjectのポインターはコンストラクターで設定されます。

コード全体をコンパイルすることができます。リンカが起動すると問題が発生します。次のメッセージが表示されます:moduleCalling.obj:エラーLNK2001:未解決の外部シンボル "public:void __thiscall classCalled :: methodCalled..."

私はdeclspecのものを使用しないので、calledLib.dllから何もエクスポートされません。

私が呼び出しているメソッド(methodCalled)は実装に存在し、そのプロトタイプはヘッダーで正しく宣言されています。classCalledは「基本的な」クラスであり、何からも継承されません。さらに、methodCalledを仮想として宣言すると、プロジェクト全体がコンパイルされ、正しく機能します...

別のDLLから「通常の」方法でオブジェクトのメソッドを呼び出せないのはなぜですか?なぜそれを「仮想」として宣言することが役立つのでしょうか。誰もが知っていますか?私にはいくつかの推測がありますが、専門家の回答はこのことを理解するのに大いに役立ちます。

PS:私はMSVC++2008を使用しています。

ありがとう!

更新:コードがどのように見えるかを反映するコードスニペットを追加します。

// part of calledLib.dll
// moduleCalled.h

class classCalled {
  public:
    int methodCalled() { return 1 };
};

// ---------------------------------------------------------------
// part of callingLib.dll
// moduleCalling.h

#include "moduleCalled.h"

class classCalling {
  public:
    classCalled* ref;
    void justSomeMethod();
};

// ---------------------
// moduleCalling.cpp

#include "moduleCalling.h"

void classCalling::justSomeMethod() {
  ref = new classCalled();
  int a = ref->methodCalled(); // <--- this is not allowed by linker,
                               // unless methodCalled is made virtual.
}
4

1 に答える 1