У меня есть основная программа (PMAIN), которая динамически использует DLL. Предположим, что PMAIN использует 2 функции (foo1, foo2 и foo3), экспортированные DLL. Функция выглядит примерно так:
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 , затем я повторяю 100 раз, вызывая foo3; массив arr1 корректно обновляется и «сохраняет» значение в течение всего выполнения PMAIN, в то время как каждый раз, когда я вызываю foo3 массив arr2 содержит только нули, которые он получает обновляется, и когда программа снова вызывает foo3 , она снова пуста. Примерно так, как PMAIN перезаписывает адреса массива в DLL (я видел такое поведение при отладке).
Знаете ли вы, как это вообще возможно?
Разве PMAIN и DLL не должны находиться в двух разных местах памяти?