Anda sedang offline saat ini, menunggu internet Anda untuk menyambung kembali

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

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
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
1.10 1.20 3,50

Peringatan: Artikel ini telah diterjemahkan secara otomatis

Properti

ID Artikel: 118816 - Tinjauan Terakhir: 09/14/2011 09:41:00 - Revisi: 2.0

Microsoft Win32 Application Programming Interface

  • kbdll kbkernbase kbprb kbthread kbmt KB118816 KbMtid
Tanggapan
/html>"; var Ctrl = ""; document.write("