5

OCXファイル(flash.ocxなど)が登録されているかどうかをVisual C ++で確認するにはどうすればよいですか?

4

2 に答える 2

1

.ocx ファイル自体を意味する場合は、おそらく 2 つのオプションがあります。

  1. .ocx からタイプ ライブラリを読み取り、オブジェクトとインターフェイスの UUID を解析して、HKCR\CLSID、HKCR\TypeLib などの下のレジストリにそれらがすべて存在するかどうかを確認します。

  2. レジストリの HKCR\CLSID に登録されているすべてのオブジェクトをループし、.ocx を InprocServer32 参照として参照するオブジェクトがあるかどうかを確認します。一致をテストするために、読み取ったパスでパスと環境変数の展開を行う必要がある場合があります。

ただし、最初の方法では、インストールされている .OCX と同じバージョンであるかどうかは必ずしもわかりません (ただし、それぞれのディスク上のパスを確認できます)。残念ながら、2番目は非常に遅くなります。

おそらく、.ocx を再登録するのが最も簡単だと思います。

于 2012-09-20T23:02:38.033 に答える
1

ocx の clsid が HKEY_CLASSES_ROOT の下にあるかどうかを確認できます。指定した ocx が登録されているかどうかを実行時に検出するために使用する簡単なコードを次に示します。

#include<windows.h>
...
//Check  if an ocx is resisted, and push warning
HKEY subKey = NULL;
LONG ret = RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID\\{XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX}"), NULL, KEY_QUERY_VALUE|KEY_WOW64_32KEY, &subKey);
//Note that some CLSID of versioned ocx is under HKEY_CLASS_ROOT\TypeLib\{XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX}
if(ret != ERROR_SUCCESS)
{
    TCHAR message[512];
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,ret,0,message,512,NULL);
    CString msgStr = message;
#ifdef DEBUG    //Extra message on DEBUG mode
    AfxMessageBox(msgStr.GetBuffer());
#endif
    AfxMessageBox(_T("OCX not registered"), MB_OK);
}
else
{
    AfxMessageBox(_T("OCX is registered"), MB_OK);
    RegCloseKey(subKey);   //Remember to close opened key handle.
}
于 2014-03-12T15:46:31.380 に答える