OLE kontrol dapat didaftarkan dengan menggunakan Visual C++ dari Tools menu,
dari wadah tes yang disediakan dengan kontrol Development Kit (CDK), atau
dengan menggunakan regsvr atau regsvr32 aplikasi yang disediakan dengan Visual C++. Dalam
beberapa kasus, pendaftaran kontrol yang mungkin gagal; menggunakan artikel ini untuk
membantu memecahkan masalah.
Semua metode yang disebutkan sebelumnya mendaftarkan OLE kontrol menggunakan
pada dasarnya teknik yang sama. LoadLibrary() dipanggil untuk memuat kontrol
ke memori, GetProcAddress() dipanggil untuk mendapatkan alamat
DllRegisterServer() fungsi, dan kemudian DllRegisterServer() dipanggil untuk
daftar kontrol.
Alasan mengapa pendaftaran kontrol yang mungkin gagal
- Satu atau lebih diperlukan OLE dll bukanlah di jalan.
Petunjuk untuk mendistribusikan OLE kontrol serta penjelasan
dari apa dll diperlukan untuk kapal dapat ditemukan di Shipctrl.wri
file yang terletak di direktori yang sama sebagai CDK.
- Kontrol adalah loading DLL selain OLE DLL, dan adalah bahwa DLL
tidak di jalan. Ketika kontrol dimuat ke memori, setiap dll
yang secara implisit dibuka melalui perpustakaan impor juga dimuat.
Jika salah satu dll ini tidak di jalan, kontrol tidak dimuat
berhasil, jadi pendaftaran gagal.
- Satu atau lebih dll mungkin versi salah. Jika kontrol dibangun
dengan versi DLL yang lebih baru daripada yang diinstal di komputer,
kontrol mungkin tidak memuat dengan benar, jadi pendaftaran gagal.
- Versi lama Ocd25.lib terkait dengan. Jika kontrol
menggunakan MFC database kelas, mungkin ada masalah dengan
Versi dari file Ocd25.lib yang sedang terhubung ke.
- OLE kontrol terletak pada Novell server drive jauh. Dalam hal ini
kasus, hak akses ke .ocx file dapat mencegah
kontrol dari loading. Pastikan bahwa hak akses untuk .ocx
file ditetapkan untuk read-only, shareable akses, yang khas
pengaturan untuk file yang dapat dieksekusi.
Teknik-teknik pemecahan masalah
Jika tidak ada penyebab yang mungkin benar dalam kasus Anda, cobalah berikut
teknik.
- Dengan proyek kontrol dimuat dalam Visual C++, mengatur executable untuk
sesi debug untuk OLE kontrol tes wadah (Tstcon16.exe atau
Tstcon32.exe). ketika Anda mulai wadah Test (di bawah
debugger), Anda akan mendapatkan peringatan yang wadah tes tidak
berisi informasi debug. Abaikan ini dan melanjutkan.
- Dari wadah tes, mencoba untuk mendaftar kontrol. Menonton untuk
debug yang keluar dari OLE kontrol DLL atau salah satu yang tergantung dll.
Jika Anda menjalankan produk 16-bit, ingat untuk menjalankan DBWIN
program untuk menerima debug output.
Untuk informasi tentang cara menetapkan executable untuk DLL debug sesi,
Silakan lihat topik bantuan "Debugging dll" dalam buku Online.
Sebagai alternatif, Anda dapat mencoba untuk mendaftar kontrol
pemrograman. Pertama membuat MFC AppWizard aplikasi memilih
Aplikasi berbasis dialog dan OLE Automation. Memungkinkan OLE Automation akan
menginisialisasi OLE sehingga kode untuk mendaftar kontrol akan bekerja dengan baik.
Dalam kelas CWinApp yang diturunkan, Anda akan menemukan fungsi InitInstance()
dengan awal kode sebagai berikut:
BOOL CTestregApp::InitInstance()
{
// Initialize OLE libraries
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
Pada titik ini, tambahkan kode berikut segmen, yang akan memungkinkan Anda untuk
memeriksa kode kembali dari LoadLibrary(), GetProcAddress(), dan
DllRegisterServer.
#ifdef _WIN32
HINSTANCE hDLL = LoadLibrary("some.ocx");
if(NULL == hDLL)
{
// See Winerror.h for explaination of error code.
DWORD error = GetLastError();
TRACE1("LoadLibrary() Failed with: %i\n", error);
return FALSE;
}
typedef HRESULT (CALLBACK *HCRET)(void);
HCRET lpfnDllRegisterServer;
lpfnDllRegisterServer =
(HCRET)GetProcAddress(hDLL, "DllRegisterServer");
if(NULL == lpfnDllRegisterServer)
{
// See Winerror.h for explaination of error code.
DWORD error = GetLastError();
TRACE1("GetProcAddress() Failed with %i\n", error);
return FALSE;
}
if(FAILED((*lpfnDllRegisterServer)()))
{
TRACE("DLLRegisterServer() Failed");
return FALSE;
}
#else // 16-bit
HINSTANCE hDLL = LoadLibrary("regtest.ocx");
if(HINSTANCE_ERROR > hDLL)
{
// See LoadLibrary() help for explaination of error code.
TRACE1("LoadLibrary() Failed with: %i\n", hDLL);
return FALSE;
}
typedef HRESULT (CALLBACK *HCRET)(void);
HCRET lpfnDllRegisterServer;
lpfnDllRegisterServer =
(HCRET)GetProcAddress(hDLL, "DllRegisterServer");
if(NULL == lpfnDllRegisterServer)
{
// See GetProcAddress() help for explaination of error code.
TRACE("GetProcAddress() Failed");
return FALSE;
}
if(FAILED((*lpfnDllRegisterServer)()))
{
TRACE("DLLRegisterServer() Failed");
return FALSE;
}
#endif