Možné příčiny selhání registrace ovládacího prvku OLE

Prohlášení o odmítnutí odpovědnosti pro už nepodporovaný obsah KB

Tento článek byl napsán pro produkty, ke kterým již Microsoft nadále nenabízí podporu. Článek je tedy poskytován „tak, jak je“ a nebude už nadále aktualizován.

Souhrn

OLE ovládací prvky mohou být registrovány pomocí aplikace Visual C++, v nabídce nástroje z kontejner testu, pokud se řízení Development Kit (CDK), nebo pomocí aplikace služba nebo regsvr32 součástí Visual C++. V některých případech může dojít k selhání registrace ovládacího prvku; Tento článek slouží k řešení problému.

Další informace

Všechny výše uvedené metody pro registrace OLE ovládací prvek použít v podstatě stejný postup. LoadLibrary() se nazývá do paměti načíst ovládací prvek, volání GetProcAddress() je volána pro získání adresy funkce DllRegisterServer() a DllRegisterServer() se pak nazývá registrace ovládacího prvku.

Důvody, proč se pravděpodobně nezdaří registrace ovládacího prvku

  • Jeden nebo více nezbytné OLE DLL není v cestě. Pokyny pro rozmístění ovládacích prvků technologie OLE, jakož i vysvětlení, co je třeba dodat DLL lze nalézt v souboru Shipctrl.wri umístěn ve stejném adresáři jako CDK.
  • Načítání knihovny DLL než OLE DLL ovládacího prvku a tuto knihovnu DLL není v cestě. Pokud ovládací prvek je načten do paměti, všechny DLL knihovny, které jsou načteny implicitně prostřednictvím knihovnu importu také načteny. Není-li některý z těchto knihoven DLL v cestě, ovládací prvek není úspěšně načten, takže registrace se nezdaří.
  • Nesprávná verze může být jeden nebo více knihoven DLL. Pokud ovládací prvek byl vytvořen v novější verzi knihovny DLL, než je v počítači nainstalována, ovládací prvek nemusí načíst správně, tak se nezdaří registrace.
  • Starou verzi Ocd25.lib je propojen. Pokud ovládací prvek používá databázové třídy knihovny MFC, může být problém s verzí souboru Ocd25.lib, který je propojen.
  • Ovládací prvek OLE je umístěn na serveru Novell vzdálené jednotce. V tomto případě přístupová práva k souboru OCX brání ovládací prvek načítání. Ujistěte se, že přístupová práva k souboru OCX jsou nastavena na přístup jen pro čtení, ke sdílení, což je typické nastavení pro spustitelné soubory.

Postupy odstraňování potíží

Pokud žádný z možných příčin ve Tvém případě platí, zkuste následující metody.


  1. S projektem ovládací prvek načten v aplikaci Visual C++ nastavte spustitelný soubor pro relaci ladění OLE ovládacího prvku testu kontejneru (Tstcon16.exe nebo Tstcon32.exe). Při spuštění testu kontejneru (v rámci ladicího programu), obdržíte upozornění, že testovací kontejner neobsahuje informace o ladění. To ignorovat a pokračovat.
  2. Z kontejneru Test pokusí zaregistrovat ovládací prvek. Sledujte výstup ladění DLL OLE ovládací prvek nebo některý z jeho závislých knihoven DLL. Pokud používáte 16bitové produktu, nezapomeňte spustit program DBWIN získat výstup ladění.


    Informace o nastavení spustitelného souboru pro knihovnu DLL ladění relace, naleznete v tématu nápovědy "Ladění knihovny DLL" v Books Online.
Jako alternativu můžete pokusit zaregistrovat ovládací prvek programově. Vytvoření aplikace MFC AppWizard výběrem aplikace založené na dialogové okno a automatizace OLE. Tak, aby kód, který chcete zaregistrovat ovládací prvek bude pracovat správně, umožňující automatizaci OLE bude inicializovat OLE. Ve třídě odvozené CWinApp najdete funkce InitInstance() s počáteční kód takto:

BOOL CTestregApp::InitInstance(){

// Initialize OLE libraries
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}

Nyní přidejte následující kód segmentu, což vám umožní kontrolovat návratové kódy z LoadLibrary() volání GetProcAddress() a funkce 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

Vlastnosti

ID článku: 140346 - Poslední kontrola: 12. 1. 2017 - Revize: 1

Váš názor