Forums Neueste Beiträge
 

Probleme mit 64 Bit System und Singel Instance

03/05/2009 - 10:36 von Andre G. | Report spam
Hallo zusammen,
ich habe seit geraumer Zeit ein Tool bei mir im Einsatz, das beim starten
der Anwendung überprüft ob bereits eine andere Instanz davon làuft und diese
dann mit den Startargumenten der neu gestarteten Instanz benachrichtigt.

Das hat auch alles soweit wunderbar funktioniert, jedoch seit dem ich mein
System auf 64Bit mgestellt habe bekomme ich immer einen Fehler (entweder
accessvaliation, oder serializationexception).

Mir ist noch nicht ganz klar woran das liegt, da dieser Fehler nur auftritt,
wenn ich die andere Instanz darüber benachrichtige. Sobald ich die gleich
nachricht an die gleiche instanz schicke funktioniert alles wunderbar.

Ich habe versucht das ganze einmal in einer kleineren Application
erfolgreich nachzustellen (siehe Code).

Der Fehler tritt in WndProc auf. und hier entweder beim deserialisieren oder
beim kopieren der Daten.

Hat jemand eine idee, wieso das der Fall ist, bzw. wieso es nur auf 64 Bit
Systemen auftritt.
Besser wàre natürlich noch eine zuverlàssige Möglichkeit (sowohl 32 wie auch
64Bit) um Daten von einer Instanz auf eine andere zu schicken (ohne TCP oder
andere Protokolle).


Die Ausgabe mit den Adressen sind übrigens sowohl beim empfangen wie auch
versenden identisch.

Hoffe es hat jemand eine Idee.

Danke,
Andre






Quell Code
private void button3_Click(object sender, EventArgs e)
{
byte[] buffer = Serialize(textBox1.Text);

System.Runtime.InteropServices.GCHandle bufferHandle =
System.Runtime.InteropServices.GCHandle.Alloc(buffer,
System.Runtime.InteropServices.GCHandleType.Pinned);

IntPtr ptr = bufferHandle.AddrOfPinnedObject();

int size = buffer.Length;

COPYDATASTRUCT st = new COPYDATASTRUCT();
st.Data = ptr;
st.DataSize = size;
st.dwData = 0;

System.Runtime.InteropServices.GCHandle dataHandle =
System.Runtime.InteropServices.GCHandle.Alloc(st,
System.Runtime.InteropServices.GCHandleType.Pinned);

MessageBox.Show(st.DataSize.ToString() + " / " +
st.Data.ToInt32().ToString() + " / " + st.dwData.ToString());


foreach (System.Diagnostics.Process pro in
System.Diagnostics.Process.GetProcessesByName("WindowsApplication1"))
{
if (pro.MainWindowHandle ==
System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle)
{
continue;
}

else
{
SendMessage(pro.MainWindowHandle,
WindowMessages.WM_COPYDATA,
IntPtr.Zero,
dataHandle.AddrOfPinnedObject());
}
}
}

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, WindowMessages
msg, IntPtr wParam, IntPtr lParam);

public struct COPYDATASTRUCT
{
public int dwData;
public int DataSize;
public IntPtr Data;
}

public enum WindowMessages
{
APP = 32768,
ACTIVATE = 6,
ACTIVATEAPP = 28,
AFXFIRST = 864,
AFXLAST = 895,
ASKCBFORMATNAME = 780,
CANCELJOURNAL = 75,
CANCELMODE = 31,
CAPTURECHANGED = 533,
CHANGECBCHAIN = 781,
CHAR = 258,
CHARTOITEM = 47,
CHILDACTIVATE = 34,
CLEAR = 771,
CLOSE = 16,
COMMAND = 273,
COMMNOTIFY = 68,
COMPACTING = 65,
COMPAREITEM = 57,
CONTEXTMENU = 123,
COPY = 769,
COPYDATA = 74,
CREATE = 1,
CTLCOLOR = 0x0019,
CTLCOLORBTN = 309,
CTLCOLORDLG = 310,
CTLCOLOREDIT = 307,
CTLCOLORLISTBOX = 308,
CTLCOLORMSGBOX = 306,
CTLCOLORSCROLLBAR = 311,
CTLCOLORSTATIC = 312,
CUT = 768,
DEADCHAR = 259,
DELETEITEM = 45,
DESTROY = 2,
DESTROYCLIPBOARD = 775,
DEVICECHANGE = 537,
DEVMODECHANGE = 27,
DISPLAYCHANGE = 126,
DRAWCLIPBOARD = 776,
DRAWITEM = 43,
DROPFILES = 563,
ENABLE = 10,
ENDSESSION = 22,
ENTERIDLE = 289,
ENTERMENULOOP = 529,
ENTERSIZEMOVE = 561,
ERASEBKGND = 20,
EXITMENULOOP = 530,
EXITSIZEMOVE = 562,
FONTCHANGE = 29,
GETDLGCODE = 135,
GETFONT = 49,
GETHOTKEY = 51,
GETICON = 127,
GETMINMAXINFO = 36,
GETTEXT = 13,
GETTEXTLENGTH = 14,
HANDHELDFIRST = 856,
HANDHELDLAST = 863,
HELP = 83,
HOTKEY = 786,
HSCROLL = 276,
HSCROLLCLIPBOARD = 782,
ICONERASEBKGND = 39,
INITDIALOG = 272,
INITMENU = 278,
INITMENUPOPUP = 279,
UNINITMENUPOPUP = 293,
INPUTLANGCHANGE = 81,
INPUTLANGCHANGEREQUEST = 80,
KEYDOWN = 256,
KEYUP = 257,
KILLFOCUS = 8,
MDIACTIVATE = 546,
MDICASCADE = 551,
MDICREATE = 544,
MDIDESTROY = 545,
MDIGETACTIVE = 553,
MDIICONARRANGE = 552,
MDIMAXIMIZE = 549,
MDINEXT = 548,
MDIREFRESHMENU = 564,
MDIRESTORE = 547,
MDISETMENU = 560,
MDITILE = 550,
MEASUREITEM = 44,
MENUCHAR = 288,
MENUSELECT = 287,
MENUCOMMAND = 294,
NEXTMENU = 531,
MOVE = 3,
MOVING = 534,
NCACTIVATE = 134,
NCCALCSIZE = 131,
NCCREATE = 129,
NCDESTROY = 130,
NCHITTEST = 132,
NCLBUTTONDBLCLK = 163,
NCLBUTTONDOWN = 161,
NCLBUTTONUP = 162,
NCMBUTTONDBLCLK = 169,
NCMBUTTONDOWN = 167,
NCMBUTTONUP = 168,
NCMOUSEMOVE = 160,
NCPAINT = 133,
NCRBUTTONDBLCLK = 166,
NCRBUTTONDOWN = 164,
NCRBUTTONUP = 165,
NEXTDLGCTL = 40,
NOTIFY = 78,
NOTIFYFORMAT = 85,
NULL = 0,
PAINT = 15,
PAINTCLIPBOARD = 777,
PAINTICON = 38,
PALETTECHANGED = 785,
PALETTEISCHANGING = 784,
PARENTNOTIFY = 528,
PASTE = 770,
PENWINFIRST = 896,
PENWINLAST = 911,
POWER = 72,
POWERBROADCAST = 536,
PRINT = 791,
PRINTCLIENT = 792,
QUERYDRAGICON = 55,
QUERYENDSESSION = 17,
QUERYNEWPALETTE = 783,
QUERYOPEN = 19,
QUEUESYNC = 35,
QUIT = 18,
RENDERALLFORMATS = 774,
RENDERFORMAT = 773,
SETCURSOR = 32,
SETFOCUS = 7,
SETFONT = 48,
SETHOTKEY = 50,
SETICON = 128,
SETREDRAW = 11,
SETTEXT = 12,
SETTINGCHANGE = 26,
SHOWWINDOW = 24,
SIZE = 5,
SIZECLIPBOARD = 779,
SIZING = 532,
SPOOLERSTATUS = 42,
STYLECHANGED = 125,
STYLECHANGING = 124,
SYSCHAR = 262,
SYSCOLORCHANGE = 21,
SYSCOMMAND = 274,
SYSDEADCHAR = 263,
SYSKEYDOWN = 260,
SYSKEYUP = 261,
TCARD = 82,
TIMECHANGE = 30,
TIMER = 275,
UNDO = 772,
USER = 1024,
USERCHANGED = 84,
VKEYTOITEM = 46,
VSCROLL = 277,
VSCROLLCLIPBOARD = 778,
WINDOWPOSCHANGED = 71,
WINDOWPOSCHANGING = 70,
WININICHANGE = 26,
KEYFIRST = 256,
KEYLAST = 264,
SYNCPAINT = 136,
MOUSEACTIVATE = 33,
MOUSEMOVE = 512,
LBUTTONDOWN = 513,
LBUTTONUP = 514,
LBUTTONDBLCLK = 515,
RBUTTONDOWN = 516,
RBUTTONUP = 517,
RBUTTONDBLCLK = 518,
MBUTTONDOWN = 519,
MBUTTONUP = 520,
MBUTTONDBLCLK = 521,
MOUSEWHEEL = 522,
MOUSEFIRST = 512,
MOUSELAST = 522,
MOUSEHOVER = 0x2A1,
MOUSELEAVE = 0x2A3,
SHNOTIFY = 0x0401,
UNICHAR = 0x0109,
THEMECHANGED = 0x031A,
WM_COPYDATA = 0x004A,
}

protected override void WndProc(ref Message m)
{
if (m.Msg == (int)WindowMessages.WM_COPYDATA)
{
COPYDATASTRUCT data =
(COPYDATASTRUCT)System.Runtime.InteropServices.Marshal.PtrToStructure(m.LParam,
typeof(COPYDATASTRUCT));

MessageBox.Show(data.DataSize.ToString() + " / " +
data.Data.ToInt32().ToString() + " / " + data.dwData.ToString());

byte[] buffer = new byte[data.DataSize];
System.Runtime.InteropServices.Marshal.Copy(data.Data,
buffer, 0, buffer.Length); // Hier tritt die accessvaliation auf

string script = Deserialize(buffer).ToString(); // hier der
serialarisierungs fehler

this.BringToFront();

textBox2.Text = script;

//MessageBox.Show(script);
}
else
base.WndProc(ref m);
}
 

Lesen sie die antworten

#1 Frank Dzaebel
03/05/2009 - 21:26 | Warnen spam
Hallo Andre,

ich habe seit geraumer Zeit ein Tool bei mir im Einsatz, [...] Das hat
auch alles soweit wunderbar funktioniert, jedoch seit dem ich mein System
auf 64Bit mgestellt habe bekomme ich immer einen Fehler (entweder
accessvaliation, oder serializationexception).



naja, bei dem gezeigten Quellcode ist das ziemlich normal.
Hàttest Du zum Beispiel managed WCF o.à.
benutzt wàre das sicher nicht passiert.

OK - typischerweise liegen die Fehler bei exzessiven
PInvoke bei nicht funktionierendem X64 immer bei
Pointer-Typen, die fàlschlich als int o.à.
im C# deklariert wurden, obwohl sie nativ
etwa Pointer sind, die dann unter X64 eben
8 Byte anstatt 4 Byte sind.

Nach kurzem Überfliegen Deines Codes habe
ich einen Verdacht:

Nutze für COPYDATASTRUCT besser die Deklaration:

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public UIntPtr dwData;
public uint cbData;
public IntPtr lpData;
}

Dann die anderen Dinge entsprechend anpassen.
________


Weitere Informationen zu der 64 Bit Thematik diesbzgl.:

[Migrating 32-bit Managed Code to 64-bit]
http://msdn.microsoft.com/en-us/lib...73190.aspx

[UIntPtr-Struktur (System)]
http://msdn.microsoft.com/de-de/lib...ntptr.aspx

[IntPtr-Struktur (System)]
http://msdn.microsoft.com/de-de/lib...ntptr.aspx

[SpankyJ : What is the difference in a P/Invoke signature between "byref
byte" and "byte[]"?]
http://blogs.msdn.com/joshwil/archi...50200.aspx

[Avoiding Polymorphism (Windows)]
http://msdn.microsoft.com/en-us/lib...84154.aspx

[__int3264 Attribute (Windows)]
http://msdn.microsoft.com/en-us/lib...67390.aspx

__________

BTW: Singleton-Instance-Verhalten kann man zum Teil
einfacher mit einem Mutex machen. Allerdings
ohne Übergabe von Informationen:

bool isFirstInstance;
Mutex mutex = new Mutex(false, "Local\\"+
someUniqueName, out isFirstInstance);

// wenn 'isFirstInstance' true ist, liegt die
// erste Instanz der App hier vor, sonst
// eine andere Instanz.

[Ensuring that only a single instance of a .NET application is running]
http://www.ai.uga.edu/mc/SingleInstance.html

[CodeProject: C# Single Instance App With the Ability To Restore From System
Tray (Using Mutex)]
http://www.codeproject.com/KB/cs/Si...Mutex.aspx


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen