C++ DLL in VB 6.0

ibo

Mitglied
Hallo leute,

ich hab da ein kleines problemchen!

Undzwar hab ich in C++ eine DLL geschrieben, die eine funktion getData() enthält!

Jetzt versuche ich es in VB mit Private Declare Function getData Lib "C:\....." () As TLGData einzubinden
aber es funktioniert nicht!

TLGData ist eine struktur die einpaar int und double variablen beeinhaltet!

Hier mein code der DLL:

TLGData WINAPI getData()
{
TLGData pData[1];
LPCTSTR Archiv ="Prozesswertarchiv";
LPCTSTR Variable ="OP_MID_Q_l/s";
SYSTEMTIME Start;
SYSTEMTIME Stop;
PTLG_ARCHIVDATARAW pDaten;
DWORD Anzahl = 1;
DWORD Meldung = 0;
CMN_ERROR Error;
HWND hwndp = NULL;

TLGConnect (hwndp, &Error);

memset (&pDaten, 0, sizeof pDaten);
memset (&Error, 0, sizeof (Error));

Start.wYear = 2004;
Start.wMonth = 8;
Start.wDay = 26;
Start.wHour = 15;
Start.wMinute = 37;
Start.wSecond = 0;

Stop.wYear = 2004;
Stop.wMonth = 8;
Stop.wDay = 26;
Stop.wHour = 15;
Stop.wMinute = 39;
Stop.wSecond = 0;


TLGGetArchivDataEx(Archiv, Variable, &Start, &Stop, &pDaten, &Anzahl, &Meldung, &Error);

pData[0].Jahr = pDaten->stTime.wYear;
pData[0].Monat = pDaten->stTime.wMonth;
pData[0].Tag = pDaten->stTime.wDay;
pData[0].Stunde = pDaten->stTime.wHour;
pData[0].Minute = pDaten->stTime.wMinute;
pData[0].Sekunde = pDaten->stTime.wSecond;
pData[0].Flag = pDaten->dwFlags;
pData[0].Value = pDaten->doValue;

TLGDisconnect(&Error);

return pData[0];
}

BOOL APIENTRY DllMain( HANDLE, DWORD , LPVOID)
{


return (TRUE);
}

Und in VB rufe ich es so auf:


Private Sub Form_Load

Dim x(1) As TLGData

x(0)= getData()

End Sub



Und er bringt mir den Fehler DLL-Einsprungspunkt getData nicht gefunden!


Was muss ich machen, damit er es findet

danke
 
Danke MAN...:)

jetzt hab ich aber ein anderes problem...

ich hab in meiner funktion die in der dll steht einen zeiger in der parameter liste

bool getData (String, String, Time, Time, pointer)

so...
der pointer ist von einem selbst definierten Datentyp der Drei membervariablen enthält!

jetzt hab ich in VB
genau den gleichen Datentyp erstellt!
und rufe diesen als einen array in meiner parameterliste auf!
was ja angeblich in VB gehen soll!?

Und das sieht so aus

x = getData(String, String, Time, Time, MeinDatentyp(10))

Jetzt habe ich es geschaft das er syntax mäsig und von wegen geht nicht mit byval oder byref nicht mehr rummotzen kann

Aber jetzt strürtz VB jedes mal beim kompilieren ab!
:eek:

und ich habe keine ahnung warum!

hab ihr ne ahnung an was es legen könnte

danke

mfg

ibo
 
Dann hast du jetzt anscheinend noch das Problem mit dem bool Rückgabewert in der C++-Dll. Boolwerte sehen in C++ anders aus als in VB.

Nimm lieber bei beiden den Datentyp long und setz den Wert entweder auf 0 oder 1, dann passt es auch bei beiden.

Ich hatte selbst mal sowas in der Arbeit geschrieben, war auch kurz vor dem verzweifeln, aber letztendlich hat alles geklappt.

Ein Tipp: Pass auch mit Int und Long bei VB und C++ auf, die unterscheiden sich gänzlich! Hier dazu auch noch ein gutes Script: http://www.activevb.de/rubriken/kolumne/kol_4/cpptovbtypen.html


mfG,
MAN
 
Zuletzt bearbeitet:
Danke.....

Die Seite ist super!
ich werds probieren!
hoffentlich hab ich erfolg!

wenn noch fragen auftauchen sollten... auf dich ist ja verlass MAN
!:)

Dankeschön!:)
 
MAN ich hab noch ein problem!

Auf der Site steht zwar wie die funktionen aussehen müssen!
Ich machs auch genau so wie dort!

Also in der DLL hab ich ne struktur die so aussieht

typedef struct _STIME
{ long Jahr;
long Monat;
long Tag;
long Stunde;
long Minute;
long Sekunde;
} STIME;


und ich benutze diese struktur in meiner Funktionn als Parameter

long getData( LPCTSTR, LPCTSTR, STIME Sta)

ok? so weit ist doch alles klar oder?

in VB sieht die Struktur so aus:

Private Type STIME
Jahr As Long
Monat As Long
Tag As Long
Stunde As Long
Minute As Long
Sekunde As Long
End Type

So jetz hab ich diese funktion in VB implementiert mit:

Private Declare Funktion getData Lib"C:\DLL" (ByVal s1 As Strin, ByVal s2 As String, sta As STIME)

und in:

Private Sub Form_Load

Dim x As long
Dim sta As STIME

s1="Blah"
s2 ="BlahBlah"

sta.Jahr=2004
sta.Monat=9
sta.Tag =2
.....usw...



x=getData(s1, s2, sta)



Debug.Print getData(s1, s2, sta);

End Sub


Und wenn ichs Kompilieren will bringt er mir den Fehler:

Fasche DLL-Aufrufkonvention
Und zeigt auf die Zeile mit dem x= getData.(.....)

Warum
wenn ich in meiner struktur STIME nur eine Variable habe gehts einwandfrei
aber schon bei zwei kommt dieser verda.... te fehler!: :eek: :eek

Dringenst hilfe
danke!
 
Das liegt ganz einfach daran, dass deine deklarierte Funktion in VB kein Rückgabewert hat.

Das:
Code:
Private Declare Funktion getData Lib"C:\DLL" (ByVal s1 As Strin, ByVal s2 As String, sta As STIME)
mit dem:
Code:
x=getData(s1, s2, sta)
passt nicht ganz ;)

Versuchs mit:
Code:
Private Declare Funktion getData Lib "C:\DLL" _
(ByVal s1 As String, ByVal s2 As String, sta As STIME) As Long


mfG,
MAN
 
oh:eek:


Doch meine funktion hat schon ein rückgabewert, aber ich hab vergessen ihn hinzuschreiben!

Und weißt du ob man von der c++ dll die werte in den Parametern zurückgeben kann?

also das was in den klammern steht
 
Zuletzt bearbeitet:
Eine Variable übergeben, also sozusagen referenzieren kannst du auch ganz einfach:

In deiner C++-DLL schreibst du das dann so:

Code:
__declspec(dllexport) long __stdcall getData( long* uebergabeParam1, long* uebergabeParam2 )
{
   (*uebergabeParam1) = 1234;
   (*uebergabeParam2) = 5678;

   return 1;
}
In VB definierst du dann die Funktion folgendermaßen:
Code:
Private Declare Funktion getData Lib "C:\DLL" _
(ByRef uebergabeParam1 As Long, ByRef uebergabeParam1 As Long) As Long

Private Sub Form_Load()
   Dim x As Long
   Dim param1 As Long
   Dim param2 As Long

   x = getData(param1, param2)

   MsgBox "Datenuebergabe der Funktion: param1 = " & param1 & "  |  param2 = " & param2
End Sub
Dies sollte dir dann eine MessageBox mit dem Text Datenuebergabe der Funktion: param1 = 1234 | param2 = 5678 ausgeben.

Ich hoffe ich konnte dir damit helfen!


mfG,
MAN
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück