powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наследование и инициализация
8 сообщений из 33, страница 2 из 2
Наследование и инициализация
    #39535020
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходники тут

Компилирую в MSVC 2015 c Platform toolset = v140_xp

Потом из Win7 копирую DLL в XP.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535024
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем непонятно почему static не совсем static и смущает строчка из асма
Код: plaintext
1.
57B0217C  mov         ecx,dword ptr [_tls_index (57B505C8h)]  


TLS и static вроде как разные вещи.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535082
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535141
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima T,

DllMain и жизнь до родов
Спасибо, не знал.
Чуть поправил
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
TEST_API void fntest(const char* str) {
	static bool is_init = false;
	if(!is_init) {
		start();
		is_init = true;
	}
	lite_log(0, str);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		//start();
		break;
	case DLL_THREAD_ATTACH:
		break;
	case DLL_THREAD_DETACH:
		break;
	case DLL_PROCESS_DETACH:
		//stop();
		break;
	}
	return TRUE;
}


Вылетает там же, но стало лучше :) Процесс не исчезает молча, а происходит перехват обращения к несуществующей памяти через SEH на стороне EXE, вызывающего DLL.

Странно что с этим static нет проблем. Попробую методом научного тыка переписать те static похожим способом.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535168
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Методом научного тыка выявлено что помогает замена
Код: plaintext
1.
2.
3.
4.
	static static_info_t& si() noexcept {
		static static_info_t x;
		return x;
	}


на указатель
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	static static_info_t& si() noexcept {
		static static_info_t* x;
		if(x == NULL) {
			x = new static_info_t();
		}
		return *x;
	}


Вылетать в XP перестало. Правда еще не заработало как надо.

Похоже MSVC зачем-то использует TLS при компиляции static переменных, непонятно зачем. Может это как-то с конструкторами связано, т.к. у меня почти в каждом классе своя struct static_info_t и внутри stl-контейнеры и т.п.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535184
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заработало! Победил DLL под XP.

Еще нельзя так писать
Код: plaintext
1.
static uint32_t x = TlsAlloc();


так работает
Код: plaintext
1.
2.
static uint32_t x = TLS_OUT_OF_INDEXES;
if (x == TLS_OUT_OF_INDEXES) x = TlsAlloc();



Осталось понять как с этим жить, т.е. как код поправить чтобы тормозов не добавить.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535247
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВылетает там же, но стало лучше :) Процесс не исчезает молча, а происходит перехват обращения к несуществующей памяти через SEH на стороне EXE, вызывающего DLL.
а как ты с dll связываешь, статически надеюсь?
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535272
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima TВылетает там же, но стало лучше :) Процесс не исчезает молча, а происходит перехват обращения к несуществующей памяти через SEH на стороне EXE, вызывающего DLL.
а как ты с dll связываешь, статически надеюсь?
Если статически (неявно), то проблемы не будет, если я правильно понял предупреждение от MS 20860246 . Т.е. thread_local и static нормально будут работать без всяких нездоровых дописок в коде.

Проблема в том что мне надо из FoxPro вызывать, а там можно только явно загружать DLL, т.е. через LoadLibrary().
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наследование и инициализация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]