Laden...

DllImport

Erstellt von Joerg vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.605 Views
J
Joerg Themenstarter:in
152 Beiträge seit 2005
vor 18 Jahren
DllImport

Hallo,
ich muss auf eine DLL von TomTom zugreifen.(TTSDK5Link.dll)
mein bisheriger Code:


public unsafe class Navi
{
   int Error = -1;
   [DllImport("TTSDK5Link.dll",CharSet=CharSet.Auto)]
   public static extern int IsApplicationRunning(ref int Error);
   public Navi()
   {
   }
   public int TT_Status()
   {
      int Rueckgabe = 2;
      try
      {
         Rueckgabe = IsApplicationRunning(ref Error);
      }
      catch (Exception ex)
      {
         MessageBox.Show(ex.Message);
         Rueckgabe = Error;
      }
      return Rueckgabe;
   }
}

Nach dem Starten des Programms bekomme ich die Meldung "MissingMethodException" mittels meiner MSGBox angezeigt.
IsApplicationRunning erwartet als Parameter einen int als Zeiger.

Was mache ich falsch?

Gruß Joerg

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Joerg,

klingt danach, dass die Funktion IsApplicationRunning (zumindest nicht in dieser Schreibweise bzw. Groß-Kleinschreibung) in der DLL enthalten ist.

herbivore

J
Joerg Themenstarter:in
152 Beiträge seit 2005
vor 18 Jahren

Hallo,
wir haben das SDK von TomTom.
In der Dokumentation ist die Funktion wie folgt beschrieben:

2.4. INT IsApplicationRunning(TError* aError)

Command parameters:
TError aError - additional error information returned from application

Returns: 1 if Navigator is running, 0 otherwise.
Supported Since: version 5.00

Verifies if TomTom Navigator is running.

4.2. TError structure

int iError;

Weiterhin wird geschrieben das die besagte DLL auf dem PDA ins Windows Verzeichnis kopiert werden muss.


public unsafe class Navi
{
		
public struct TError 
	{
		public int iError;
	} 

[DllImport("TTSDK5Link.dll",CharSet=CharSet.Auto)]
public static extern int IsApplicationRunning(ref TError Error);
			
public Navi()
{
}
public int TT_Status()
{
                int Rueckgabe = -1;
                TError Error;
	Error.iError = 0;
	try
	{
		Rueckgabe = IsApplicationRunning(ref Error);
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
	return Rueckgabe;
}
}

Gruß Joerg

S
8.746 Beiträge seit 2005
vor 18 Jahren

Ist das Code für CF? Falls ja, TomTom bietet ja einen fertigen Wrapper für .NET und das CF an. Versuchs doch mal damit. Könnte es sein, dass die Methode in deiner Version nicht unterstützt wird. Scheint erst in 5.0 zu gehen.

Ansonsten sieht der Code aber ok aus.

Das "unsafe" scheint übrigens unnötig, wenn du nicht anderweitig unsafe-Code nutzt. Die Benutzung von DLLImport-Funtktionen alleine erfordert noch keine unsafe-Deklaration.

J
Joerg Themenstarter:in
152 Beiträge seit 2005
vor 18 Jahren

Hallo,
ja es handelt sich hier um eine Anwendung für ein PDA.
Diesen Wrapper wo bekomm ich den her und ist der kostenlos?

Deine Aussage

Scheint erst in 5.0 zu gehen

bezieht sich auf das SDK von TomTom??
Wir haben das 5er!.

Gruß Joerg

S
8.746 Beiträge seit 2005
vor 18 Jahren

Ist wohl leider ein kommerzielles Produkt:

http://ttncf.pp-p.com/

Tolle Geschäftsidee mit .NET-Wrappern sein Geld zu verdienen, muss ich mal drüber nachdenken. 🙂

Ansonsten weist die MissingMethodException tatsächlich darauf hin, dass der Methodenname in der DLL nicht gefunden werden konnte. Gehe doch mal mit einem DLL-Viewer rein und schau nach, ob du die Funktion findest und ob sie ggf. anders heisst (Groß/Kleinschreibung...).

4.221 Beiträge seit 2005
vor 18 Jahren

Ev. ist die Funktion auch nur über den Ordinal ansprechbar.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
8.746 Beiträge seit 2005
vor 18 Jahren

Ist gut möglich, schließlich muss man für das SDK Geld abdrücken, ist aber wohl nicht mehr als eine DLL und eine Doku.

S
8.746 Beiträge seit 2005
vor 18 Jahren
J
Joerg Themenstarter:in
152 Beiträge seit 2005
vor 18 Jahren

Hallo
Danke für den Link.
Leider ist mein Englisch nicht sehr besonders!!

Aber auch dieser Code funktioniert nicht!


[DllImport("TTSDK5Link.dll",
EntryPoint="?IsApplicationRunning@CTomTomAPI@@QAAHPAUTError@1@@Z",
CharSet=CharSet.Auto)]
public static extern int IsApplicationRunning(ref TError Error);

int ......()
{...

Rueckgabe = IsApplicationRunning(ref Error);
...}

Die Fehlermeldung "MissingMethodException" erscheint zwar nicht mehr dafür stürzt das ganze Prog gleich ab!

Oder habe ich den Beitrag komplett falsch verstanden?

Gruß Joerg

S
8.746 Beiträge seit 2005
vor 18 Jahren

Es gibt ein Programm namens depends.exe, mit dem kannst du dir DLLs "ansehen". Da solltest du dann jede Funktion finden. Anstelle dich weiter mit den Namen abzuplagen kannst du auch die Ordinalzahl (also quasi die Nummer der Funktion) beim DLLImport angeben (mit "#" vor der Nummer, siehe DLLImport-Hilfe). Der Name, den du in C# bei der Deklaration der Funktion verwendest ist dann quasi nur .NET-intern.

Alternativ kannst du auch "dumpbin /exports deine.dll" auf der Studio-Commandline-Console verwenden.