0

DLL を動的に使用するメイン プログラム (PMAIN) があります。PMAIN が、DLL によってエクスポートされた 2 つの関数 (foo1、foo2、および foo3) を使用するとします。関数は次のようなものです。

int __stdcall foo1(){
  str = new MyStruct;
}
int __stdcall foo2(){
  str.LC->objF1();
}

int __stdcall foo3(int val){
  str.LC->objF2(val);
}

MyStruct は次のようになります。

struct MyStruct{
  MyObject LC
}

MyObject は次のとおりです。

class MyObject{
 private:
  int arr1[100];
  int arr2[100];
  int Index;
 public:
  MyObject();
  ~MyObject();
  void objF1();
  void objF2(int val);
}

void MyObject::objF1(){
  for(int i=0;i<100;i++){
    arr1[i]=1;
  }
}

void MyObject::objF2(int val){
  Index++;
  arr2[Index]=val;
}
MyObject::MyObject(){
  for(int i=0;i<100;i++){
    arr1[i]=0;
    arr2[i]=0;
  }
  Index=-1;
}

PMAIN から、最初にfoo1を呼び出し、次に foo2 を呼び出し、次にfoo3を 100 回呼び出します。配列arr1は正しく更新され、PMAIN の実行全体で値を「保持」しますが、foo3 を呼び出すたびに、配列arr2には更新されるゼロのみが含まれ、プログラムがfoo3をもう一度呼び出すと、再び空白になります。PMAIN が DLL 内の配列のアドレスを上書きする方法 (デバッグを実行しているときにこの動作が見られました)。

どうすればそれが可能か知っていますか?

PMAIN と DLL は、メモリ内の 2 つの異なる場所にあるはずではありませんか?

4

1 に答える 1

0

DLL で作成された変数は、プログラムが使用するものと同じであるため、プログラムにエラーがある場合は変数を上書きできます。

これは私には間違っているように見えます:

int __stdcall foo1(){
  str = new MyStruct;
}
int __stdcall foo2(){
  str.LC->objF1();  
}

int __stdcall foo3(int val){
  str.LC->objF2(val);
}

str がポインタの場合 (新しいものであるため)、そのメンバにアクセスするには operator-> を使用する必要があります。そのようです:

int __stdcall foo1(){
  str = new MyStruct;
}
int __stdcall foo2(){
  str->LC.objF1();
}

int __stdcall foo3(int val){
  str->LC.objF2(val);
}

LC はポインターではなく、構造体の自動変数であるため、. operator. 上記のように修正しました。

于 2011-04-07T13:07:39.067 に答える