Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Beskriver en demonteringsinstruktion för den integrerade utvecklingsmiljön (IDE) som ska visas.
Syntax
public struct DisassemblyData {
public uint dwFields;
public string bstrAddress;
public string bstrAddressOffset;
public string bstrCodeBytes;
public string bstrOpcode;
public string bstrOperands;
public string bstrSymbol;
public ulong uCodeLocationId;
public TEXT_POSITION posBeg;
public TEXT_POSITION posEnd;
public string bstrDocumentUrl;
public uint dwByteOffset;
public uint dwFlags;
};
Members
dwFields
Den DISASSEMBLY_STREAM_FIELDS konstant som anger vilka fält som ska fyllas i.
bstrAddress
Adressen som en förskjutning från en viss startpunkt (vanligtvis början av den associerade funktionen).
bstrCodeBytes
Kodbytesekvenser för den här instruktionen.
bstrOpcode
Opcode för den här instruktionen.
bstrOperands
Operanderna för denna instruktion.
bstrSymbol
Symbolnamnet, om det finns något, associerat med adressen (offentlig symbol, etikett och så vidare).
uCodeLocationId
Kodplatsidentifieraren för den här demonterade raden. Om kodkontextadressen för en rad är större än kodkontextadressen för en annan, blir den demonterade kodplatsidentifieraren för den första också större än kodplatsidentifieraren för den andra.
posBeg
Den TEXT_POSITION som motsvarar positionen i ett dokument där demonteringsdata börjar.
posEnd
Den TEXT_POSITION som motsvarar positionen i ett dokument där demonteringsdata slutar.
bstrDocumentUrl
För textdokument som kan representeras som filnamn bstrDocumentUrl fylls fältet i med filnamnet där källan finns med formatet file://file name.
För textdokument som inte kan representeras som filnamn är bstrDocumentUrl det en unik identifierare för dokumentet och felsökningsmotorn måste implementera metoden GetDocument .
Det här fältet kan också innehålla ytterligare information om kontrollsummor. Mer information finns i Kommentarer.
dwByteOffset
Antalet byte som instruktionen är från början av kodraden.
dwFlags
Den DISASSEMBLY_FLAGS konstant som anger vilka flaggor som är aktiva.
Remarks
Varje DisassemblyData struktur beskriver en instruktion om demontering. En matris med dessa strukturer returneras från metoden Läs .
Den TEXT_POSITION strukturen används endast för textbaserade dokument. Källkodsintervallet för den här instruktionen fylls endast i för den första instruktionen som genereras från en instruktion eller rad, till exempel när dwByteOffset == 0.
För dokument som inte är textbaserade kan en dokumentkontext hämtas från koden och fältet bstrDocumentUrl ska vara ett null-värde. Om bstrDocumentUrl fältet är samma som bstrDocumentUrl fältet i föregående DisassemblyData matriselement, sätt bstrDocumentUrl till null-värde.
Om fältet dwFlags har flaggan DF_DOCUMENT_CHECKSUM inställd, följer ytterligare kontrollsumsinformation den sträng som pekas på av fältet bstrDocumentUrl. Efter null-strängavslutaren följer ett GUID som identifierar checksum-algoritmen. Detta följs av ett värde på 4 bytes som anger hur många bytes kontrollsumman består av, och därefter kommer kontrollsummans bytes. Se exemplet i det här avsnittet om hur du kodar och avkodar det här fältet i Visual C#.
Example
Fältet bstrDocumentUrl kan innehålla ytterligare information än en sträng om DF_DOCUMENT_CHECKSUM flaggan har angetts. Processen att skapa och läsa den här kodade strängen är enkel i Visual C++. Men i Visual C# är det en annan sak. För dem som är nyfikna visar följande exempel ett sätt att skapa den kodade strängen från Visual C# och ett sätt att avkoda den kodade strängen i Visual C#.
using System;
using System.Runtime.InteropServices;
namespace MyNamespace
{
class MyClass
{
string EncodeData(string documentString,
Guid checksumGuid,
byte[] checksumData)
{
string returnString = documentString;
if (checksumGuid == null || checksumData == null)
{
// Nothing more to do. Just return the string.
return returnString;
}
returnString += '\0'; // separating null value
// Add checksum GUID to string.
byte[] guidDataArray = checksumGuid.ToByteArray();
int guidDataLength = guidDataArray.Length;
IntPtr pBuffer = Marshal.AllocCoTaskMem(guidDataLength);
for (int i = 0; i < guidDataLength; i++)
{
Marshal.WriteByte(pBuffer, i, guidDataArray[i]);
}
// Copy guid data bytes to string as wide characters.
// Assumption: sizeof(char) == 2.
for (int i = 0; i < guidDataLength / sizeof(char); i++)
{
returnString += (char)Marshal.ReadInt16(pBuffer, i * sizeof(char));
}
// Add checksum count (a 32-bit value).
Int32 checksumCount = checksumData.Length;
Marshal.StructureToPtr(checksumCount, pBuffer, true);
for (int i = 0; i < sizeof(Int32) / sizeof(char); i++)
{
returnString += (char)Marshal.ReadInt16(pBuffer, i * sizeof(char));
}
// Add checksum data.
pBuffer = Marshal.AllocCoTaskMem(checksumCount);
for (int i = 0; i < checksumCount; i++)
{
Marshal.WriteByte(pBuffer, i, checksumData[i]);
}
for (int i = 0; i < checksumCount / sizeof(char); i++)
{
returnString += (char)Marshal.ReadInt16(pBuffer, i * sizeof(char));
}
Marshal.FreeCoTaskMem(pBuffer);
return returnString;
}
void DecodeData( string encodedString,
out string documentString,
out Guid checksumGuid,
out byte[] checksumData)
{
documentString = String.Empty;
checksumGuid = Guid.Empty;
checksumData = null;
IntPtr pBuffer = Marshal.StringToBSTR(encodedString);
if (null != pBuffer)
{
int bufferOffset = 0;
// Parse string out. String is assumed to be Unicode.
documentString = Marshal.PtrToStringUni(pBuffer);
bufferOffset += (documentString.Length + 1) * sizeof(char);
// Parse Guid out.
// Read guid bytes from buffer and store in temporary
// buffer that contains only the guid bytes. Then the
// Marshal.PtrToStructure() can work properly.
byte[] guidDataArray = checksumGuid.ToByteArray();
int guidDataLength = guidDataArray.Length;
IntPtr pGuidBuffer = Marshal.AllocCoTaskMem(guidDataLength);
for (int i = 0; i < guidDataLength; i++)
{
Marshal.WriteByte(pGuidBuffer, i,
Marshal.ReadByte(pBuffer, bufferOffset + i));
}
bufferOffset += guidDataLength;
checksumGuid = (Guid)Marshal.PtrToStructure(pGuidBuffer, typeof(Guid));
Marshal.FreeCoTaskMem(pGuidBuffer);
// Parse out the number of checksum data bytes (always 32-bit value).
int dataCount = Marshal.ReadInt32(pBuffer, bufferOffset);
bufferOffset += sizeof(Int32);
// Parse out the checksum data.
checksumData = new byte[dataCount];
for (int i = 0; i < dataCount; i++)
{
checksumData[i] = Marshal.ReadByte(pBuffer, bufferOffset + i);
}
}
}
}
}