PInvoke Problem,...

08/12/2008 - 08:13 von Kerem Gümrükcü | Report spam
Hallo,

ich bin auf ein interessantes Problem mit folgender Funktion
gestoßen, aus dem ich nicht so ganz schlau werde. Der erste
Aufruf der Funktion erfolgt problemlos, allerdings ist der
zweite Aufruf immer mit einer Speicherzugriffsverletzung
verbunden. Kann mir das jemand bestàtigen:

//deklaration

[DllImport("newdev.dll")]
[return:MarshalAs(UnmanagedType.Bool)]
public static extern bool InstallNewDevice(IntPtr hwndParent,
ref Guid ClassGuid,
out uint pReboot);


//aufruf

Guid pEmptyGuid = Guid.Empty;
uint pReboot = 0;

InstallNewDevice(this.Handle, ref pEmptyGuid, out pReboot);


Ich kann mir dieses Verhalten nicht ganz erklàren,...übersehe ich
da vielleicht etwas,...

Das Original: http://msdn.microsoft.com/en-us/lib...63391.aspx

Egal, wie ich die Funktion aufrufe, alos mit direkten Zeigern auf
Strukturen im Speicher (IntPtr), oder nur "leeren" Speicher, der
erste Aufruf klappt, der zweite Aufruf sagt immer:

System.AccessViolationException: Es wurde versucht, im geschützten Speicher
zu lesen oder zu schreiben. Dies ist hàufig ein Hinweis darauf, dass anderer
Speicher beschàdigt ist.

Ein entladen des Modules aus dem Prozesspeicher, direkt nach dem Aufruf
bringt da
auch nichts, bzw. an dem Problem àndert sich nichts,...

Hat jemand einen Lösungsvorschlag,...?

Grüße

Kerem

Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.pro-it-education.de/soft...iceremover
Latest Open-Source Projects: http://entwicklung.junetz.de
"This reply is provided as is, without warranty express or implied."
 

Lesen sie die antworten

#1 Stefan Simon
08/12/2008 - 10:28 | Warnen spam
"Kerem Gümrükcü" schrieb im Newsbeitrag
news:
Hallo,

ich bin auf ein interessantes Problem mit folgender Funktion
gestoßen, aus dem ich nicht so ganz schlau werde. Der erste
Aufruf der Funktion erfolgt problemlos, allerdings ist der
zweite Aufruf immer mit einer Speicherzugriffsverletzung
verbunden. Kann mir das jemand bestàtigen:



In der Form, wie du die Funktion nutzt, kann ich das Verhalten bestàtigen,
ja.

Hat jemand einen Lösungsvorschlag,...?



Klar, lade die Funktion dynamisch:

\\\
public partial class Form1 : Form
{
delegate bool
dlgInstallNewDevice(IntPtr hwndParent,
ref Guid ClassGuid, out uint pReeboot);

[DllImport("kernel32.dll")]
private static extern IntPtr LoadLibrary(string fileName);

[DllImport("kernel32.dll")]
static extern IntPtr GetProcAddress(IntPtr IntPtr_Module, string
csProcName);

[DllImport("kernel32.dll")]
static extern bool FreeLibrary(IntPtr IntPtr_Module);

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
InstallNewDevice();
}

private void InstallNewDevice()
{
IntPtr hDll = LoadLibrary("newdev.dll");
IntPtr pInst = GetProcAddress(hDll, "InstallNewDevice");
Guid pEmptyGuid = Guid.Empty;
uint pReboot = 0;

dlgInstallNewDevice fInst (dlgInstallNewDevice)Marshal.GetDelegateForFunctionPointer(
pInst, typeof(dlgInstallNewDevice));

this.Invoke(fInst, new object[] {this.Handle, pEmptyGuid,
pReboot});
FreeLibrary(hDll);
}

}
///

Stefan Simon

Ähnliche fragen