Laden...

DllImport

Erstellt von Quotenmausi vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.735 Views
Q
Quotenmausi Themenstarter:in
21 Beiträge seit 2004
vor 18 Jahren
DllImport

Hallo alle zusammen,

ich habe eine sehr schöne Dll mit Doku und einem Vergleichsprogamm in VB6. Eigentlich ideale Bedingungen um die DLL einzubauen, würde man denken. Aber leider is dem nicht so. Bin mir fast sicher dass es nur ne kleinigkeit ist aber ich sehs einfach nicht. Aber jetzt mal zur Funktion.
so ist sie laut Doku in Visual C++ deklariert.

short _IMPORT MakeBmp( char* Name, long format, BYTE* data, long Zahl1, long Zahl2, double s1, double s2, double s3, 
long filter, long anzahl, double groesse, long Typ

und so in VB6

Public Declar Funktion MakeBmp( ByVal Name as String , ByVal format as Long, ByRef data as Byte, _ 
ByVal Zahl1 as Long, ByVal Zahl2 as Long, ByVal s1 as Double, ByVal s2 as Double, ByVal s3 as Double, ByVal filter als Long, _ 
ByVal anzahl as Long, ByVal groesse as Double, ByVal Typ as Long) as Integer

So hab ich jetzt versucht das ganze in C# unter .Net einzubauen

		
[DllImport("meine.dll")]									
private static extern int MakeBmp(string Name, long format, ref byte data, long Zahl1, long Zahl2, double s1, double s2, double s3, long filter, long anzahl, double groesse, long Typ );
 

Die DLL sollte jetzt unter Name ein Bitmap speichert, das mit den restlichen Parametern erstellt wurde. Meine Variablen enthalten die gleichen Werte wie im VB6 Code. Trotzdem erhalte ich als Rückmeldung dass nicht genügend Speicher vorhanden ist. Ich weiss aber nicht wo ich da was falsch mache. Muss ich einen der Parameter in DllImport auf nen bestimmten Wert setzen? Hab zwar schon einiges ausprobiert, aber noch nicht das richtige gefunden.
Hoffe es kann mir jemand weiterhelfen.
Danke schonmal

[edit]Was ich noch fast vergessen hätte aber glaub ich eh unerheblich ist. Die double-Werte in VB6 werden mit einem Komme nicht mit einem Punkt geschrieben[/edit]

L
667 Beiträge seit 2004
vor 18 Jahren

Also ich weiss jetzt nicht, ob das was mit Deinem Problem zu tun hat (ich glaube eher nicht, aber sicher ist sicher) - Der Typ Long auf VB bzw. C-Seite entspricht dem Typ Int32 oder int auf C# seite.

Von daher würde ich schonmal alle Long-Variablen als int importieren. Ansonsten könnte ich mir vorstellen, dass es etwas mit dem ref byte zu tun hat.

Ich hatte mal ein ähnliches Problem, mit einem ByRef String, den ich versucht habe, als ref string zu importieren. Irgendwann hab ich dann durch Trial & Error herausgefunden, dass der ByRef String bzw. &string dem StringBuilder in C# entspricht.

Also an der Stelle würde ich mal weiter forschen, vielleicht findet sich dazu ja was in der MSDN....

"It is not wise to be wise" - Sun Tzu

Q
Quotenmausi Themenstarter:in
21 Beiträge seit 2004
vor 18 Jahren

Vielen Dank für den Hinweis mit dem int und StringBuilder. Hab jetzt mal alle long in int gewandelt und mein Name übergebe ich als StringBuilder und nicht als string (ist in C++ als char* definiert) und jetzt bekomm ich immerhin dass die Funktion Fehlerfrei durchlaufen wurde, auch wenn mein File noch nicht gespeichert wird, aber was noch nicht ist kann ja noch werden. Werd auf jedenfall gleich noch in der MSDN nach den verschiedenen Variablenentsprechungen suchen.

S
8.746 Beiträge seit 2005
vor 18 Jahren

data kannst du anstelle von "ref byte" als "byte[]" definieren.