Compact Framework Ansi strings in ein Struct

14/11/2008 - 12:58 von Kostas | Report spam
Hallo Zusammen,

es geht um eine Fremdanwendung die in C++ geschrieben ist, und auf ein
PDA làuft. Die C++ App kann über Windows Messaging mit anderen
Anwendungen kommunizieren. Meine Anwendung ist in C# geschrieben.

Die Aufgabe ist, in C# eine Struct die Strings enthàlt, in ein
COPYDATASTRUCT zu packen und per sendMessage an die C++ App zu senden.

Die Struct in C++ sieht so aus:
typedef struct ADDRESS {
TCHAR pcCountry[32];
TCHAR pcCity[128];
};

CopyDataStruct in C++ sieht so aus:
COPYDATASTRUCT cds;
cds.dwData = CODE_ADDRESS; <<ist eine Konstante für das Paket
cds.cbData = sizeof( CESDInterface::_ADDRESS );
cds.lpData = &PointerAddress;

Und so wird das CopyDataStruct gesendet
::SendMessage( hwndESDWindow, WM_COPYDATA, (WPARAM) m_hWnd, (LPARAM) (&cds) );

Das möchte ich jetzt in C# abbilden.
Das große Problem ist, das bei CF kein CharSet.Ansi als Attribut für
das Struct existiert. Die C++ Anwendung benötigt jedoch die Strings
als Ansi.

So habe ich es versucht. Richtigerweise ist cd.cbData = 32 * 2 Bytes
wegen unicode.

[StructLayout(LayoutKind.Sequential)] //CharSet=CharSet.Ansi
public struct Address
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string pcCountry;
//public StringBuilder pcCountry;
}


Address address = new Address();
address.pcCountry = "München";
IntPtr addressPointer =
Marshal.AllocHGlobal(Marshal.SizeOf(address));

COPYDATASTRUCT cd = new COPYDATASTRUCT();
cd.dwData = Help.CODE_ADDRESS;
cd.cbData = Marshal.SizeOf(typeof(Address));
cd.lpData = addressPointer;


Help.sendMessage(Help.hwndMaptrip, Help.WM_COPYDATA, Help.hwndMTClient,
IntPtr(cd)); <<< ist der LParam IntPtr(cd) so richtig?

Hat jemand eine Idee wie man den source umbauen müsste so das die
Strings in Ansi gesendet werden können? In diversen Foren habe ich den
Tipp bekommen die einzelnen Parameter der Struct als StringBuilder und
nicht als string anzulegen. Den StringBuilder kenn ich schon, kann mich
jedoch nicht recht vorstellen wie das gehen soll.

Gruß Kostas
 

Lesen sie die antworten

#1 Klaus Mayer
17/11/2008 - 17:50 | Warnen spam
Hallo Kostas,

ich weiß nicht genau, ob ich Dir helfen kann, aber ich hatte mal ein
àhnliches Prob mit einer Fremdanwendung,
welche einen ANSI-String zur Steuerung des Druckvorgangs brauchte.
Gelöst habe ich es mit

public static extern bool TextOut(IntPtr hdc, int x, int y, string
textstring, int charCount);

private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
int strLE = Header_Data.Length;
IntPtr hdc = ev.Graphics.GetHdc();
TextOut(hdc, 1, 1, Header_Data, strLE);
ev.Graphics.ReleaseHdc(hdc);
//

Funzte einwandfrei.

Grüße

Klaus

Ähnliche fragen