Empfangen von Zeichenfolgen durch Interop
Ich habe Probleme, eine Zeichenfolge aus einem von mir geschriebenen C-Code zurückzugewinnen.
Zunächst einige allgemein nicht realisierte Hintergrundinformationen: Ich möchte die vom Benutzer lesbare Zeichenfolge für einen TAPI-TSP von der TAPI-API erhalten. Ich habe eine semi-funktionsfähige TAPI-Lösung implementiert, die sich auf die Zuordnung von Treibernamen zu gespeicherten Zeichenfolgen stützt, möchte diese jedoch ändern, um stattdessen mit permanenten Leitungs-IDs zu arbeiten, da einer unserer Kunden eine (Alcatel) -PBX hat, die sich weigert, auf andere Weise zu funktionieren .
In C definiere ich die Funktion in meiner Header-Datei als:
__declspec(dllexport) void GetDeviceName(long DeviceId, wchar_t* DeviceName);
Die Funktion lautet wie folgt:
__declspec(dllexport) void GetDeviceName(long DeviceId, wchar_t* DeviceName)
{
//tapi code here...
//copy the string to DeviceName
wcscpy(DeviceName, (wchar_t*)((char *)devCaps + devCaps->dwLineNameOffset));
}
Wie oben erwähnt, wird dies irgendwann etwas Nützliches bewirken, aber im Moment bin ich froh, wenn abc in meinem wchar_t * / StringBuilder abgelegt ist und ich das in C # sehen kann.
In C # definiere ich die Funktion als:
[DllImport("SBW.Tapi.TapiInterop.dll", CharSet = CharSet.Auto)]
static extern void GetDeviceName(long DeviceId, StringBuilder DeviceName);
Ich definiere DeviceName als StringBuilder, weil ein String nicht veränderbar ist und ich möchte, dass der DeviceName in C (Dies wird von MS empfohlen). Ich habe auch den Rückgabetyp auf gesetztvoid
auf die schlanke Hoffnung, dass das auch etwas betrifft (vgldiese hilfreicher Mono-Artikel für eine teilweise pseudowissenschaftliche Erklärung).
Und nenne es so:
StringBuilder name = new StringBuilder();
name.EnsureCapacity(100);
long n = 0;
GetDeviceName(n, name);
Ich hänge meinen Debugger an den laufenden Prozess an, setze einen Haltepunkt und stelle im C-Code fest, dass der StringBuilder irgendwie pervers ist und als Nullzeiger für den nicht verwalteten Code bereitgestellt wird.
Eine AccessViolationException wird anschließend in C # ausgelöst.
Was ist schief gelaufen?
Entfernen des langen Parameters hilft. Ich kann "abc" zu meinem DeviceName-Parameter in C hinzufügen. Ich möchte diese lange Variable jedoch! Was mache ich falsch oder störe ich, um einen Absturz zu erzwingen, indem ich diesen langen Parameter dort habe?