Windows NT6.xでレガシーアプリからマルチスレッドでネイティブ機能を呼び出すと TLS未初期化でクラッシュする

Windows 10で、Windows NT 5.xベースのアプリを開発、内部からマルチスレッドでネイティブ機能を呼び出したところクラッシュしてしまった。

tls
どうやら、TLS領域が初期化されていないらしく、Windows 2000/XPでWindows 7ネイティブアプリを起動したときの様な挙動になってしまっている。

Acess Violation on IHTMLDocument2::write() in a thread
調べたら似たようなコード書いてる人が居た。
でも、IStream は使ってないのだよなぁ‥‥。

猫科研究所 - mainとスレッドの前後処理(3)
Manually create a Thread Local Storage (TLS) Callback

この辺り参考にしてTlsの初期化処理を自前で入れるしかないんだろうか・ω・

#pragma comment(linker, "/INCLUDE:__tls_used")
#pragma data_seg(".tls")
static void*        flpthread_xla =0;
static DWORD flpthread_tls_data = 0;
static HANDLE flpthread_tls_index = NULL;
IMAGE_TLS_DIRECTORY ti=
{
  (DWORD)&flpthread_tls_data,
  (DWORD)&flpthread_tls_data,
  (DWORD)&flpthread_tls_index,
  (DWORD)(&flpthread_xla+1),
  (DWORD)0, // unused (not supported)
  (DWORD)0
};
#pragma data_seg()
void __stdcall tls_callback( void*, DWORD dwReason, void* )

{
 void *tls;
  switch( dwReason )
  {
  case DLL_PROCESS_ATTACH:
//    printf( "process attach\n" );
    break;
  case DLL_PROCESS_DETACH:
//    printf( "process detach\n" );
    break;
  case DLL_THREAD_ATTACH:
  ti.StartAddressOfRawData=TlsAlloc();
//    vec_tls = new std::vector;
//    printf( " thread attach\n" );
    break;
  case DLL_THREAD_DETACH:
//    delete vec_tls;
//    printf( " thread detach\n" );
    break;
  }
}

#pragma data_seg(".CRT$XLB")
PIMAGE_TLS_CALLBACK _xl_b = tls_callback;
//PIMAGE_TLS_CALLBACK p_thread_callback = TlsCallBack;
#pragma data_seg()

コールバック関数は動くけど、初期化が良く分からぬ ・ω・
malloc で自分でメモリ確保するんかな?

おすすめ

4件のフィードバック

  1. 黒翼猫 より:

    >>1
    thx i will try it :3

  2. 黒翼猫 より:

    >>1
    thx i will try it :3

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です