Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Matrisattribut kan också användas med flerdimensionella matriser. Var dock noga med att se till att varje dimension i matrisen har ett motsvarande attribut. Till exempel:
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(2.0)
]
interface multiarray
{
void arr2d( [in] short d1size,
[in] short d2len,
[in, size_is( d1size, ), length_is ( , d2len) ] long array2d[*][30] ) ;
}
Föregående matris är en överensstämmande matris (av storlek d1size ) med 30 elementmatriser (med d2len-element som levereras för varje). Kommatecknet i parenteserna för attributet [size_is] anger att värdet i d1size tillämpas på matrisens första dimension. På samma sätt anger kommandot i parenteserna för attributet [length_is] att värdet i d2len tillämpas på matrisens andra dimension.
MIDL 2.0-kompilatorn innehåller två metoder för att konvertera parametrar: mixed-mode (/Os) och fullständigt tolkad (/Oif eller /Oicf). Som standard kompilerar MIDL-kompilatorn gränssnitt i blandat läge. Du behöver inte uttryckligen ange växeln /Os för att hämta marskalkning i blandat läge.
Den fullständigt tolkade metoden konverterar data helt offline. Detta minskar stub-kodens storlek avsevärt, men det ger också sämre prestanda. I blandat läge marshaling, stubs marskalkar vissa parametrar online. Även om detta resulterar i en större stub-storlek, ger det också ökad prestanda.
Försiktighet
Var försiktig när du kompilerar IDL-filer i det här läget. Användning av flerdimensionella matriser i blandat läge kan resultera i parametrar som inte är korrekt konverterade. Kommandoradsväxeln /Oicf rekommenderas när gränssnittet definierar parametrar som är flerdimensionella matriser.
Attributet [string] kan också användas med flerdimensionella matriser. Attributet gäller för den minst betydande dimensionen, till exempel en konform matris med strängar. Du kan också använda flerdimensionella pekarattribut. Till exempel:
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(2.0)
]
interface multiarray
{
void arr2d([in] short d1len,
[in] short d2len,
[in] size_is(d1len, d2len) ] long ** ptr2d) ;
}
I föregående exempel är variabeln ptr2d en pekare till ett d1len-storleksblock med pekare, som var och en pekar på d2len-pekare till långa.
Flerdimensionella matriser motsvarar inte matriser med pekare. En flerdimensionell matris är ett enda, stort datablock i minnet. En matris med pekare innehåller bara ett block med pekare i matrisen. De data som pekarna pekar på kan finnas var som helst i minnet. Dessutom tillåter ANSI C-syntax att endast den mest betydande matrisdimensionen (längst till vänster) är ospecificerad i en flerdimensionell matris. Därför är följande en giltig instruktion:
long a1[] [20]
Jämför detta med följande ogiltiga instruktion:
long a1[20] []