PRB: Memanggil LoadLibrary() untuk memuat DLL yang telah TLS statis

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 118816 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

GEJALA

Dynamic-link library (DLL) menggunakan __declspec(benang) untuk mengalokasikan statis benang penyimpanan lokal (TLS). Ada tidak ada masalah yang terkait dengan menjalankan sebuah aplikasi yang terkait dengan perpustakaan statis yang sesuai. Namun, ketika aplikasi menggunakan LoadLibrary fungsi untuk memuat DLL alih-alih menggunakan versi statis, LoadLibrary gagal pada Win32s dengan kode galat 87: parameter tidak sah.

LoadLibrary berhasil pada komputer yang menjalankan Windows 98, Windows NT, atau Windows 2000 dalam situasi ini. Namun, perilaku memanggil fungsi dalam DLL yang referensi statis TLS variabel is undefined. Pada Microsoft Windows 95, LoadLibrary gagal dan GetLastError fungsi kembali tahun 1114 - ERROR_DLL_INIT_FAILED (dynamic link library inisialisasi rutin gagal). Pada Windows 2000, LoadLibrary fungsi berhasil. Namun, upaya apapun untuk mengakses TLS data menyebabkan pelanggaran akses (AV).

PENYEBAB

Ini adalah pembatasan LoadLibrary dan __declspec. Ruang variabel global untuk thread dialokasikan pada jangka waktu. Ukuran ini didasarkan pada perhitungan persyaratan aplikasi ditambah persyaratan dari semua perpustakaan yang statis terhubung. Jika DLL menggunakan TLS statis dan dinamis-terhubung di sebuah aplikasi, ketika LoadLibrary atau FreeLibrary ini disebut, sistem harus menemukan semua thread yang ada dalam proses dan memperbesar atau kompak memori TLS mereka menurut ukuran TLS statis di DLL baru dimuat. Proses ini terlalu banyak untuk sistem operasi untuk mengelola, yang dapat menyebabkan pengecualian baik ketika DLL dimuat secara dinamis atau kode referensi data.

PEMECAHAN MASALAH

Dll yang menggunakan __declspec(benang) tidak bisa dimuat dengan LoadLibrary.

Kode DLL harus dimodifikasi untuk menggunakan fungsi-fungsi TLS tersebut sebagai TlsAlloc, dan mengalokasikan TLS jika DLL mungkin penuh dengan LoadLibrary. Atau, DLL yang menggunakan __declspec(benang) harus hanya secara implisit dimuat ke dalam aplikasi.

INFORMASI LEBIH LANJUT

Untuk menentukan apakah DLL menggunakan statis TLS, Dumpbin.exe alat yang dapat digunakan untuk membuang informasi header. DLL telah statis TLS jika nilai-nilai HEADER OPSIONAL berisi ukuran yang lebih besar dari 0 (nol) di direktori penyimpanan Thread, sebagai berikut:
517B20 RVA [18] [ukuran] Thread penyimpanan direktori

Properti

ID Artikel: 118816 - Kajian Terakhir: 14 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Win32 Application Programming Interface, ketika digunakan dengan:
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Kata kunci: 
kbdll kbkernbase kbprb kbthread kbmt KB118816 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:118816

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com