2009-08-13 1 views
1

J'ai déjà passé toute la journée à résoudre ce problème, mais pas encore de chance. Dans mon projet, je mis la Utilisation des ATL propriété à statique Lien vers ATL sur la Genera l page de propriétés et définissez la Runtime Library propriété à multi-thread (/ MT) sur le Code Page de propriétés Generation (dossier C/C++). Cependant DependencyWalker montre toujours la dépendance Atl71.dll.Atl71.dll denpendency existe toujours Même le lien statique à ATL est sélectionné

Je googlé et trouvé cette page http://www.eggheadcafe.com/forumarchives/vcatl/Mar2006/post26077463.asp avec une solution d'ajouter Atlwin.h juste après atlbase.h. Cette solution a aidé à réduire la dépendance sur atl71.dll. Cependant, il introduit un nouveau problème, qui est CreateWindow ne peut pas fonctionner correctement ..

// 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); 

Le hwnd est NULL.

Donc, la solution de l'ajout de atlwin.h ne peut pas être utilisé, je me demande si quelqu'un a rencontré le problème de lien statique similaire avant? Comment le résoudre?

Environnement: VS 2003 .Net

Merci!

Répondre

0

J'ai trouvé un problème similaire lors de la mise à niveau à partir de Visual Studio 6 à 2005. Le correctif a été d'inclure le numéro de version dans le nom de la classe de fenêtre, donc dans mon cas, il ressemblait à ceci:

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

Donc, avec Visual Studio 2003, vous pourriez trouver que:

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

fonctionne.

(à un niveau beaucoup plus fondamental, vous appelez AtlAxWinInit()?)

+0

je l'ai changé: #define ATLAXWIN_CLASS "AtlAxWin71" (def en atldef.h) hwnd = :: CreateWindow (_T (ATLAXWIN_CLASS), ...); Le problème est toujours là. Le résultat GetLastError est 0 (ERROR_SUCCESS). Une idée? – bionicoder

+0

@bionicoder: Oui. Désolé, pas une idée. – RichieHindle

0

BTW: Il semble, enlever "Multi-thread (/ MT)" - est redondant, cette option concerne la durée d'exécution mais pas ATL.

ajouter du code ci-dessous S'il vous plaît (de l'échantillon msdn) à découvrir pourquoi hwnd est 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); 
+0

La valeur de retour de GetLastError() est 0 = ERROR_SUCCESS. Donc, CreateWindow a réussi. Cependant, le hwnd = 0x00000000 – bionicoder

+0

dans ce cas, vérifiez votre proc de fenêtre et assurez-vous que vous ne faites pas quelque chose maladroit pendant WM_CREATE, WM_NCCREATE, etc., y compris ne pas passer à DefWindowProc quand vous le devriez. –

+0

Désolé, il y a quelques erreurs dans la sortie après l'exécution de CreateWIndow. Je viens de le trouver. La voici: Exception de première chance à 0x004a6ebc dans DlgStatic.exe: 0xC0000005: violation de l'accès à l'emplacement de lecture 0x00000000. La création du contrôle a échoué pour 'microsoft.com' Code d'erreur: 0x8007000e - Stockage insuffisant pour terminer cette opération. Cette erreur se produit après l'ajout de atlwin.h. Sans cela, cela fonctionne bien, sauf le problème ATL71.DLL – bionicoder

0

Une alternative à l'appel CreateWindow est AtlAxCreateControl. cependant, pour autant que je sache, si vous utilisez cela, vous apporterez encore la dépendance sur atl71.dll.

Si vous souhaitez héberger le navigateur Web et que vous ne pouvez pas dépendre de atl71.dll, vous devrez probablement écrire le code de la colle vous-même. Ce n'est pas très difficile pour l'hébergement de base - cela devrait prendre moins de temps que le jour où vous l'avez dépensé. vous avez également plus de contrôle.

Voici un exemple: http://support.microsoft.com/default.aspx/kb/196339/en-us

Vous avez seulement besoin d'un petit sous-ensemble de cela, surtout la logique CWBExplorerBar :: SetSite ainsi que la mise en œuvre d'un sous-ensemble des interfaces OLE, dont la plupart peuvent revenir E_NOTIMPL jusqu'à ce que vous avez besoin de cette fonctionnalité .

Questions connexes