既存の 32 ビット アプリケーションを 64 ビットに変換しようとしているときに、COM 相互運用コードを正しく動作させるのに問題が発生しました。このコードは、さまざまな Windows SDK ヘッダー/IDL ファイルから変換したマネージ コードを使用して、構造化ストレージ API にアクセスしています。
を に呼び出そうとすると、コードが失敗IPropertyStorage.ReadMultiple()
しSTG_E_INVALIDPARAMETER
ます。以前の相互運用呼び出し toStgOpenStorageEx
およびは正常に機能IPropertySetStorage.Open
しているようです。MSDN は、このエラーは PROPSPEC パラメータに問題があることを意味すると主張していますが、32 ビット アプリケーションとしてコンパイルすると同じパラメータ値が正常に機能し、返される値は指定されたプロパティの正しい文字列値です。
関連するビットは次のとおりです。
// PropertySpecKind enumeration.
public enum PropertySpecKind : uint
{
Lpwstr = 0,
PropId = 1
}
// PropertySpec structure:
[StructLayout(LayoutKind.Explicit)]
public struct PropertySpec
{
[FieldOffset(0)] public PropertySpecKind kind;
[FieldOffset(4)] public uint propertyId;
[FieldOffset(4)] public IntPtr name;
}
// PropertyVariant Structure:
[StructLayout(LayoutKind.Explicit)]
public struct PropertyVariant
{
[FieldOffset(0)] public Vartype vt;
[FieldOffset(8)] public IntPtr pointerValue;
}
// IPropertyStorage interface
[ComImport]
[Guid("00000138-0000-0000-C000-000000000046")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPropertyStorage
{
int ReadMultiple(
uint count,
[MarshalAs(UnmanagedType.LPArray, SizeConst = 0)] PropertySpec[] properties,
[Out, MarshalAs(UnmanagedType.LPArray, SizeConst = 0)] PropertyVariant[] values);
void WriteMultiple(
uint count,
[MarshalAs(UnmanagedType.LPArray, SizeConst = 0)] PropertySpec[] properties,
[MarshalAs(UnmanagedType.LPArray, SizeConst = 0)] PropertyVariant[] values,
uint miniumumPropertyId);
}
var properties = new PropertySpec[1];
properties[0].kind = PropertySpecKind.PropId;
properties[0].propertyId = 2;
var propertyValues = new PropertyVariant[1];
// This helper method just calls StgOpenStorageEx with appropriate parameters.
var propertySetStorage = StorageHelper.GetPropertySetStorageReadOnly(fileName);
var propertyStorage = propertySetStorage.Open(StoragePropertySets.PSGUID_SummaryInformation, StorageMode.Read | StorageMode.ShareExclusive);
propertyStorage.ReadMultiple(1, properties, propertyValues); // Exception is here.