1

この問題のトラブルシューティングに丸一日費やしましたが、まだ運がありません。私のプロジェクトでは、[一般] プロパティ ページで [ATL の使用] プロパティを [ATL への静的リンク] に設定[コード生成] プロパティ ページ (C/C++ フォルダー) で [ランタイム ライブラリ]プロパティを[マルチスレッド (/MT) ] に設定します。ただし、DependencyWalker はまだ Atl71.dll 依存関係を示しています。

私はグーグルでこのページhttp://www.eggheadcafe.com/forumarchives/vcatl/Mar2006/post26077463.aspを見つけ、 atlbase.hの直後にatlwin.hを追加するソリューションを見つけました。このソリューションは、atl71.dll への依存を減らすのに役立ちました。ただし、CreateWindow が正しく機能しないという新しい問題が発生します。

  // Creates the Web Browser control and navigates to the 
  // specified web page.
  HWND hWnd = ::CreateWindow("AtlAxWin", "http://www.microsoft.com", 
     WS_CHILD|WS_VISIBLE, 10, 10, 500, 300, hParent, NULL,
     ::GetModuleHandle(NULL), NULL);

hwnd は NULL です。

したがって、atlwin.h を追加するソリューションは使用できません。以前に同様の静的リンクの問題に遭遇した人がいるのだろうか? それを解決する方法は?

環境: VS 2003 .Net

ありがとう!

4

3 に答える 3

0

Visual Studio 6から2005にアップグレードするときに同様の問題が見つかりました。修正は、ウィンドウクラス名にバージョン番号を含めることでした。そのため、私の場合は次のようになりました。

hwndControl = ::CreateWindow("AtlAxWin80", ...);

したがって、Visual Studio 2003では、次のことがわかります。

hwndControl = ::CreateWindow("AtlAxWin71", ...);

動作します。

(もっと基本的なレベルで、あなたは呼んでいAtlAxWinInit()ますか?)

于 2009-08-13T08:13:09.287 に答える
0

ところで:「マルチスレッド(/ MT)」の削除は冗長であるようです。このオプションはランタイムに関連していますが、ATLには関連していません。

次のコード(msdnサンプルから)を追加して、hwndがNULLである理由を見つけてください

    LPVOID lpMsgBuf;
FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    GetLastError(),
    0, // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL 
);

// Display the string.
MessageBox( NULL, (LPCTSTR)lpMsgBuf, LError, MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
于 2009-08-13T08:16:14.540 に答える
0

CreateWindow 呼び出しの代替は AtlAxCreateControl です。ただし、これを使用する場合、私が知る限り、atl71.dll への依存関係が引き続き発生します。

Web ブラウザーをホストしたいが、atl71.dll に依存できない場合は、おそらくグルー コードを自分で作成する必要があります。基本的なホスティングはさほど難しいものではありません。また、より多くの制御を行うこともできます。

サンプルは次のとおりです: http://support.microsoft.com/default.aspx/kb/196339/en-us

これの小さなサブセット、主に CWBExplorerBar::SetSite のロジック、および OLE インターフェースのサブセットの実装だけが必要です。これらのほとんどは、その機能が必要になるまで E_NOTIMPL を返すことができます。

于 2009-08-13T16:22:33.753 に答える