2016-12-20 82 views
0

廃止予定のatlコード(Visual Studio 2015警告C4467)をどのように置き換える必要がありますか?
データ構造はファイル内 廃止予定のatl属性を置き換えます

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

DataType.h

あるIDLファイルには、次のように、この構造を使用する方法のdeclerationsが含まれています

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

私は取得しない何LPWSTRがあること、です同じ構造体内の[string]属性を持たない定義。そして、それは十年のために働いています。Microsoftヘルプ/ページhttps://msdn.microsoft.com/en-gb/library/8tesw2eh.aspx

[string]は、1次元のchar、wchar_tの、バイト、または同等の配列またはそのような配列へのポインタのように扱われなければならないことを示していることを述べて文字列。

DCOMにこのWCHAR *が文字列であることを伝える方法を見つける必要があります。しかし、なぜ、どのように?

[OK]を、私はGuyとHenry Eddonの "Inside Distributed COM"という本の中に示しました。 [string]属性を使用すると、実際の文字列の長さを定義せずに文字列を送信できます。属性を省略すると、CoTaskMemAllocCoTaskMemFreeを使用してこの文字列のメモリ管理を実装する必要があります。

+0

私は文脈がないので、少し答えにくいです。それがちょうどMIDLキーワードの場合は、それを削除して、正しいマッチングidlファイルをプロジェクトに追加してください。 – xMRi

+0

プロジェクトに戻った後、質問文脈を修正し、先月にいくつかの調査結果を追加しました。 – Melli

答えて

2

[string]または別のATL属性を置き換えるには、プロジェクト設定で[属性付きソースを拡張]オプションを有効にします。次に、コードをビルドするときに、属性プロセッサが属性を拡張した非属性のC++コードを使用します。展開されたコードを調べると、あなたが最初に持っていたコードに対応する非属性コードが表示されます。

+0

これは本当に役に立ちます。残念ながら、/ Fxオプションはバグです。このオプションを設定すると、予想される.mrg.cpp/.hファイルは作成されません。代わりに、 "c2337属性が見つかりません"で始まるコンパイルエラーが発生します。 – Melli

関連する問題