2016-12-20 1 views
0

Comment remplacer le code ATL obsolète (C4467 de Visual Studio 2015)?
La structure de données est dans un fichier DataType.hremplacement de l'attribut atl obsolète

struct SData4 
    { 
     SData4() { Init(); } 
     ~SData4() { Delete(); } 
     void Init(); 
     void Delete(); 
     LPWSTR m_strSomething; 
     [string] LPWSTR m_strCode; 
    }; 

Le fichier contient IDL méthode declerations utilisant cette structure comme suit:

// interface version 6.0 
[ 
    object, 
    uuid(...-.-.-.-.), 
    helpstring("IData4 Interface"), 
    pointer_default(unique) 
] 
interface IData4 : IUnknown 
{ 
    [helpstring("method SetData")] HRESULT SetData([in] long lLen, [in, size_is(lLen)] SData4* s); 
}; 

Ce que je ne comprends pas est, qu'il ya LPWSTR définitions sans l'attribut [string] dans la même structure. Et il a travaillé pendant une dizaine d'années:/La page d'aide de Microsoft https://msdn.microsoft.com/en-gb/library/8tesw2eh.aspx stipule que

[string] Indique que l'unidimensionnel char, wchar_t, octet, ou un tableau équivalent ou le pointeur sur un tel tableau doit être traité comme un chaîne.

Donc je dois trouver un moyen de dire à DCOM que cette WCHAR * est une chaîne. Mais pourquoi et comment? Ok, j'ai trouvé une indication dans le livre "Inside Distributed COM" de Guy et Henry Eddon. Ils indiquent que l'attribut [string] permet à l'utilisateur d'envoyer des chaînes sans définir la longueur de chaîne réelle. Si l'attribut est omis, vous devez implémenter la gestion de la mémoire de cette chaîne en utilisant CoTaskMemAlloc et CoTaskMemFree.

+0

Je ne vois pas de contexte, il est donc un peu difficile de répondre. S'il s'agit simplement d'un mot clé MIDL, supprimez-le et ajoutez un fichier idl correspondant au projet. – xMRi

+0

Après mon retour au projet, j'ai corrigé le contexte de la question et ajouté quelques résultats de recherche trouvés le mois dernier. – Melli

Répondre

2

Pour remplacer [string] ou un autre attribut ATL, la solution générique doit activer l'option Développer la source attribuée dans les paramètres du projet. Ensuite, lors de la construction du code, vous aurez un code C++ non attribué dans lequel le processeur d'attributs a développé les attributs. En inspectant le code développé, vous voyez ce que le code non attribué correspond à ce que vous avez eu en premier lieu.

+0

Cela serait vraiment utile. Malheureusement, il semble que l'option/Fx soit buggée. Si vous définissez cette option, les fichiers .mrg.cpp/.h attendus ne sont pas créés. Au lieu de compiler les erreurs commençant par "attribut c2337 non trouvé" se produire. – Melli