So erhalten Sie den Inhalt eines SAFEARRAY in einer Zeile im ÜberwachungsfensterC++

Programme in C++. Entwicklerforum
Anonymous
 So erhalten Sie den Inhalt eines SAFEARRAY in einer Zeile im Überwachungsfenster

Post by Anonymous »

Seit kurzem arbeite ich in C++ mit COM-Technologie, das heißt mit der Verwendung von SAFEARRAY-Objekten. Eine der ersten Herausforderungen besteht darin, den Inhalt eines solchen Objekts zu sehen: Im Überwachungsfenster sieht ein solches Objekt wie folgt aus:
Image

Das kann ich nachvollziehen, aber ich ziehe es vor, ein solches Array einzeilig anzuzeigen (dies würde es einfacher machen, zwei davon zu vergleichen). Daher habe ich die Datei „C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\Packages\Debugger\Visualizers\ZSAFEARRAY.natvis“ erstellt.

Der Grund dafür ist grundlegend: Beim Durchführen eines .natvisreload werden die nativen Visualisierer in diesem bestimmten Verzeichnis in alphabetischer Reihenfolge basierend auf dem Dateinamen behandelt. Die Verwendung eines Namens, der mit einem „Z“ beginnt, führt also dazu Datei, die nach „windows.natvis“ behandelt werden soll, wodurch der bereits vorhandene Visualizer überschrieben wird.
Aber was kann ich tun, um eine Liste von Informationen als Einzeiler anzuzeigen? Nun, die „windows.natvis“ enthält den folgenden Eintrag:

Code: Select all



32
value[$i],nvoxb



Also habe ich diesen sehr einfachen Code geschrieben:

Code: Select all

APP_LOCAL_DEVICE_ID test; // for natvis reasons: check "ListItems"
test.value[0] = 0x01;
test.value[1] = 0x02;
test.value[2] = 0x04;
test.value[3] = 0x08;
test.value[4] = 0x10;
test.value[5] = 0x11;
test.value[6] = 0xAB;
test.value[7] = 0xFF;
Das Anzeigen dieser Variablen im Überwachungsfenster führt zu folgendem Ergebnis:
Image
=> Das ist mehr oder weniger das, was ich will.
Also habe ich sehr naiv das Element SAFEARRAY in geändert meinen ZSAFEARRAY.natvis-Eintrag wie folgt:

Code: Select all



rgsabound[cDims - $i - 1].cElements
value[$i],nvoxb


Backward
cDims
rgsabound[cDims - $i - 1].cElements
rgsabound[cDims - $i - 1].lLbound
((signed short *)(*this).pvData)
...
((unsigned int *)(*this).pvData)
...


Das kann auf keinen Fall funktionieren: Die Variable $i in rgsabound[cDims - $i - 1].cElements und das Tag haben eine völlig andere Bedeutung!
Obwohl ich verstehe, warum es nicht funktionieren kann, habe ich keine Ahnung, wie ich es zum Laufen bringen kann.
Hat jemand eine Idee, wie man es bekommt? SAFERARRAY-Elemente als Einzeiler in einem Natvis?
Ich arbeite mit Visual Studio 2022.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post