2

ATL を使用して単純な COM DLL を作成し、その後に「ATL Simple Object」を追加しました。サーバーが登録されていることを確認するために、メッセージボックスを配置しました:

STDAPI DllRegisterServer(void)
{
     MessageBoxA ( NULL, "Hello World!", "Test", MB_OK );
    HRESULT hr = _AtlModule.DllRegisterServer();
        return hr;
}

登録は問題ありません。SDK の一部である OLE-COM Object Viewer を使用して、このオブジェクトがどのように見えるかを確認することにしました。ビューア レポート エラー:

 "LoadTypelib'(c:\pr\ILight.dll) failed. 
 <No system message defined> STG_E_FILENOTFOUND ($800300002)

COM dll が壊れているということですか? Viewer に dll 情報を表示させるにはどうすればよいですか?

PS Project RC ファイルの内容:

「レジストリ」

IDR_ILIGHT
    HKCR{}
IDR_LIGHT
    HKCR
    {
AboutiLight.1 = s 'Light Class'
{
    CLSID = s '{DBC53EA8-A51E-4374-B104-06A834273B0C}'
}
AboutiLight = s 'Light Class'
{       
    CurVer = s 'AboutiLight.1'
}
NoRemove CLSID
{
    ForceRemove {DBC53EA8-A51E-4374-B104-06A834273B0C} = s 'Light Class'
    {
        ProgID = s 'AboutiLight.1'
        VersionIndependentProgID = s 'AboutiLight'
        ForceRemove Programmable
        InprocServer32 = s '%MODULE%'
        {
            val ThreadingModel = s 'Apartment'
        }
        TypeLib = s '{1D9F859D-10FF-4827-A341-4A8B8E318A61}'
        Version = s '1.0'
    }
}
    }

文字列テーブル

String table
ID=IDS_PROJNAME Value=100 Caption ILight

バージョン

VS_VERSION_INFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEMASK 0x3fL
FILEFLAGS 0x0L
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_DLL
FILESUBTYPE VFT2_UNKNOWN
4

2 に答える 2

8

同じエラー (STG_E_FILENOTFOUND) を受け取った後、64 ビットと 32 ビットに関する Joe Willcoxson のコメントを見て、解決策を見つけることができました。

OLE/COM オブジェクト ビューアである OleView.exe を使用している場合、実際には 32 ビットと 64 ビットの 2 つのバージョンがあります。適切なバージョンの OleView で起動していることを確認してください。SDK のベース「BIN」フォルダー内のバージョンは 32 ビット版になります。"x64" フォルダーには 64 ビット バージョンのアプリケーションが含まれますが、これは古いバイナリとそのタイプ ライブラリ (32 ビット環境で作成されたもの) と完全には互換性がありません。

一方、新しい DLL が x64 用に積極的にコンパイルされている場合は、32 ビットの OleView でもデータを正しく読み取れない可能性が高くなります。

于 2012-12-14T20:20:48.210 に答える
2

1) DLL への正しいパスであることを確認します。

2) Visual Studio から DLL 自体を開き、タイプ ライブラリがリソースに埋め込まれていることを確認します。タイプ ライブラリが見つからない場合は、追加します。

3) すべて失敗した場合は、管理者アカウント/シェルで登録しましたか。その上で regsvr32.exe を呼び出す場合は、昇格された特権で実行していることを確認してください。

于 2012-08-02T12:37:28.383 に答える