Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
VB DLL in VEE?
22.01.2008, 15:26
Beitrag: #1
VB DLL in VEE?
Hallo,

ich habe eine Visual Basic DLL erstellt. Wenn ich in VEE eine DLL importieren will, geht es aber nicht ohne eine ".h"-Datei! Visual Basic erzeugt aber keine solche Datei. Geht es denn nur mit DLLs aus der Programmiersprache C?
Diese Nachricht in einer Antwort zitieren
22.01.2008, 22:27
Beitrag: #2
 
Hi,

leider kenne ich mit der Erstellung von DLL's nicht so richtig aus, aber wenn eine Funktion in der DLL integiert ist, dann hat sie einen Namen und Parameter dazu.
Genau das steht auch in der .h Datei, damit VEE daraus eine User-Funktion erstellen kann.

Wenn du also die Parameter kennst und den natürlich den Namen, dann kannst du daraus eine .h Datei machen.
Eine weitere Voraussetzung ist, dass die DLL grundsätzlich auch ohne Basic läuft.
Nehme zum Probieren erstmal was leichtes z.B. nur eine integer32 Zahl übergeben (long). :wink:

Gruߟ Bratbaecker
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.01.2008, 12:02
Beitrag: #3
 
In welcher Sprache deine DLL programmiert ist, ist voellig egal.
Im Prinzip ist diese DLL ja nur ein Programm, welches man anruft - also muss es von alleine nach Aufruf lauffaehig sein. Und dafuer sorgt die Endung .dll .

Damit nun VEE ( und jede andere Sprache auch ) weiss, was man an dieses Programm senden und was man davon empfangen kann, braucht man diese Erklaerungsdatei ( Header , .h) .
Wenn dein Kompiler dies nicht automatisch macht, machst du das halt per Hand.

Schau mal in das Beispiel examples/ manual / manual49.vee

Es gibt bestimmte Werte, die VEE verstehen kann, da muss man aufpasssen. Aber zu DLL s haben wir hier schon einiges geschrieben- such mal...( mach ich auch gerade ;-) )

Ansonsten sag doch mal, was dein Programm als Eingabe erwartet, und was es ausgeben soll, und wie die einzelnen Funktionen heissen...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.01.2008, 12:16
Beitrag: #4
 
So, hier mal eine Kopie- war im alten VEE-Forum....


------------------------------------
Vee versteht die Standard Ansi C Struktur:
Die .h Struktur muss so aussehen:

<returntype> <modifier> <function name> ( <type> <parameter>, ...)

wobei

returntype int, short,long,float,double, char* oder void sein muss.

modifier kann -cdecl, -pascal oder _stdcall sein.

type kann int, short,long, float, double, int* char*,short*,long*,float*,char** oder void sein


z.B. keine Eingabe, aber eine Ausgabe in double:

double aFunc()

oder 4 Eingaben, eine Ausgabe:

long AFunc( double *, long param2, long param3, char *)

mal schoen abgeschrieben aus Advanced Program Techniques Chap 12 Seite 388

Du solltest erst mal wissen, was du in deine DLL schicken willst und was du von deiner Dll erhalten willst.
Und dann faengst du mit dem einfachen an.

Und das Array musst du wohl dann in deiner DLL umschreiben, oder ein "Wrapper" schreiben, der deine Werte in ein Array schreibt.
Aber vielleicht ist Bratbaecker schon fertig mit der Umwandlung.

Wenn alles nix hilft, setzt dein Problem mal in die VRF ...Shawn Fessenden ist da der DLL EXCHANGER...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.01.2008, 12:30
Beitrag: #5
 
Vielen Dank für Eure Antworten.

Die DLL zu schreiben ist kein Problem.

Was mir allerdings fehlt, ist das Wissen über die Struktur einer .h - Datei sowie die jeweiligen Entsprechungen von Variablentypen in VB.NET und der .h - Datei.

Die Struktur "<returntype> <modifier> <function name> ( <type> <parameter>, ...)" ist mir klar, allerdings gibt es in .h - Dateien noch andere Angaben, wie z.B.

#ifdef __cplusplus
extern "C" {
#endif

(hab ich in einer .h - Datei gefunden)

oder dieser Modifier...

Ich komme aus dem VB-Bereich und hatte noch nie etwas mit solchen Dateien zu tun.

Achja: Arrays benutze ich nicht, aber Strings als Übergabe- und Rückgabewerte

mfg

Julian Berz
Diese Nachricht in einer Antwort zitieren
24.01.2008, 12:31
Beitrag: #6
 
Kurze antwort: dies sind Reste vom Kompiler, die # sind kommentare ( glaub ich ;-9 )

Man kann seinen Kompiler so einstellen, dass man direkt zwischen Vee und der Visualxyz Umgebung hin und herschalten kann.

Aber das brauchst du nicht...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2008, 20:31
Beitrag: #7
.h erstellen
Hi,

beschreibe doch mal deine Funktionen.

als Beispiel muß für Strings die .h so aussehen !

String Input =
long __stdcall Deine1Funktion(char* Buffstring)

String Output =
long __stdcall Deine2Funktion(char Buffstring)

oder mit Eingang und anderem Ausgang =
long __stdcall Deine3Funktion(char* Instring, char Outstring)

wenn ein Eingang vorhanden ist, dann muß dort auch ein z.B. Leerstring (space) dran sein !
Smile

Gruߟ Bratbaecker
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.02.2008, 08:49
Beitrag: #8
 
Hier mal ein paar mehr Infos ueber diese Header :

This may be a calling convention issue. If you put __stdacll in you Vee header file, Vee will do the right thing as regards function name decorations, so your header file would have a line like 'long __stdcall funcName(long arg1, long arg2, long arg3)'. You can tell if a function has been exported with the stdcall convention if the function name is followed by a string that looks like '@12' when running dumpbin. The '@12' tells you that the function has arguments taking 12 bytes of stack space.

Here's a link to a paper that may help:

http://www.sonic.net/~doomer/WhitePapers...onventions">http://www.sonic.net/~doomer/WhitePaper ... onventions


-----Original Message-----
From: Shawn Fessenden
Sent: Thursday, January 31, 2008 6:52 PM
To: PDL-LISTS,VRF (A-Lists,unix1)
Subject: RE: [vrf] DLL runtime error

> Function was not loadable: startupXgd

The issue is the function is not called startupXgd. It will of course depend on exactly what the project settings are in VS for this dll, but my first guess would be "_startupXgd@0".

To prevent guessing, run dumpbin /exports <dllname>. If you don't have ready access to dumpbin, you can use Depends and look for the function name.
ftp://ftp.vrfarchive.com/pub/Depends.zip">ftp://ftp.vrfarchive.com/pub/Depends.zip

Using "extern C" isn't good enough, as _stdcall function names are always decorated. The easy way to generate absolute names for export is to use a .def file with an EXPORTS section.
-SHAWN-
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.04.2010, 10:29
Beitrag: #9
RE: VB DLL in VEE?
Hi,

ich versuche schon seit Tagen eine ActiveX-DLL in VEE einzubinden - leider ohne Erfolg.

Als ersten Versuch habe ich ein einfaches Beispiel ausprobiert:

1) eine simple DLL, geschrieben mit VB6:

Public Function dlltest(Eingabe As Double) As Double
dlltest = Eingabe * 2
End Function

(zu einer DLL kompiliert)


2) eine Header-Datei mit folgendem Inhalt:

double dlltest(double Eingabe)

(habe es auch mit Strichpunkt und/oder __stdcall versucht, Import Library scheint aber zu funktionieren - bringt jedenfalls keine Fehlermeldung)


3) ein VEE-Programm

3.1) Import Library und Call dlltest / mylib.dlltest (oder in Formula)
--> Function was not loadable: dlltest , Error number: 604

3.2) ActiveX Automation References und dlltest aus dem function & object browser über drag & drop -> Formula mit Class1.dlltest(ByRef Eingabe);
--> Variable was not found: Class1 , Error number: 603

(die Funktion dlltest ist in der Klasse Class1)


Meine Frage ist jetzt: Wie kann ich in VB geschriebene DLL-Dateien in VEE verwenden?

Danke schon einmal Smile

Marc
Diese Nachricht in einer Antwort zitieren
29.04.2010, 15:40
Beitrag: #10
RE: VB DLL in VEE?
Problem gelöst =D

- die DLL in ActiveX Automation References laden
- Declare Variable - Name: TestObj, Type: Object, Sub Type: COM, Library: ActiveXDLL, Class: Class1
- in Formula: SET TestObj = CreateObject("ActiveXDLL.Class1");
TestObj.dlltest(ByRef A);

und es funktioniert Smile
Diese Nachricht in einer Antwort zitieren
29.04.2010, 16:03
Beitrag: #11
RE: VB DLL in VEE?
Da vermischen jetzt 2 Sachen, die so zur Verwirrung fuehren koennen.
beides hat mit einer DLL zu tun.

Weiter oben moechtest du eine Bibliothek in ein VEE Programm einbinden(.dll und .h), dies geht ueber IMPORT Library.

Nun zum Schluss moechtest du eine ActiveX Funktion benutzen ( die wiederum wieder in einer .dll steht, aber ganz anders benutzt wird).

Wenn du mal in die ActiveX SAchen bei VEE reinschaust, werden sich da hunderte von Moeglichkeiten finden, je nach Rechner und Konfig.

Da wird die Registry abgefragt, welche ActiveX Sachen dein System anbietet. Und wenn man die dann in VEE anklickt und aufruft, sind diese verfuegbar...

Gut geloest !
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.04.2010, 08:36
Beitrag: #12
RE: VB DLL in VEE?
Das Problem war ja das VB nur eine ActiveX-DLL erstellen kann (also ohne Header). Nach eurem Rat die Header-Datei selbst zu erstellen, hat es immer noch nicht funktioniert. Anaxares hat leider nicht mehr geschrieben, ob und wie es dann bei ihm geklappt hat.

Mit dem genauen Aufruf der Datei hatte ich Probleme. In der Manual ist nur ein Beispiel für Excel, daher wusste ich nicht wie die Syntax für meine DLL ist. Seltsam, dass drag & drop über den function & object browser nicht funktioniert, wenn ich sie in die Automation References eingebunden habe.

Aber gut, jetzt funktioniert es ja und vielleicht nützt das hier doch noch dem einen oder anderen :-)

Schönen Tag noch!
Diese Nachricht in einer Antwort zitieren
30.04.2010, 13:33 (Dieser Beitrag wurde zuletzt bearbeitet: 30.04.2010 13:46 von detlef.)
Beitrag: #13
RE: VB DLL in VEE?
Hi,
damit wir uns nicht missverstehen: ich finde es toll, wie und das du es geloest hast.
Nur passt die ActiveX Sache eigentlich nicht in diese Ueberschrift.
Obwohl es "vom Fundament her " gleich ist, sind es 2 verschiedene Sachen. Und mit Sicherheit kann man unter VB dll s mit .h erstellen.
Dann ist das VB - Projekt keine ActiveX-Sache, sondern eine Library...aber im Kern ist was identisches drinne ;-)


Vielleicht helfen ja auch mal diese WIKI Erklaerungen weiter:

http://de.wikipedia.org/wiki/Dynamic_Link_Library
http://de.wikipedia.org/wiki/ActiveX

und dann auch mal schauen bei .h und com ....
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.04.2015, 11:56 (Dieser Beitrag wurde zuletzt bearbeitet: 22.04.2015 11:59 von HowToVEE.)
Beitrag: #14
RE: VB DLL in VEE?
Hallo,

ich grabe dieses alten Threat mal wieder aus !
Ich habe vor 5 Monaten eine USB-Temperatursensor besorgt, der zum Auslesen der Werte eine DLL und ein H-File mitliefert (allerdings für LabView.)

Ich hatte damals diesen Threat durchgekaut bin aber zu keinem befriedigenden Ergebnis gekommen.
Konnte das Problem dann mit einem Workaround lösen. Habe den Sensor mit einem mitgelieferten Testprogramm angesteuert und den Datenverkehr auf der Schnittstelle beobachtet. Mit ein wenig Detektivarbeit konnte ich mir das Protokoll erschließen, so daß ich den Sensor direkt über die Schnittstelle ansprechen und auslesen kann.

Jetzt habe ich von der gleichen Firma einen USB-Temperatur/Feuchtesensor besorgt. Leider schaffe ich nicht die Feuchtewert zu "entschlüsseln", so daß ich mich wieder mal der DLL widmen muß.

Meine Erkenntnisse/Vermutungen sind, das das H-File nicht dem Ansi-C Standard entspricht.

Leider ist vom Lieferanten keine Unterstützung zu erwarten.

Hier ein Auszug aus einer damaligen Email von mir:

Bindet man die DLL mit den H-File ein werden in VEE keinerlei Funktionen „angezeigt“.

Schreibe ich im H-File anstelle von

BOOL CALLBACK _export SensGetChangeFlag(VOID);

jetzt nun

int _stdcall SensGetChangeFlag(void);

wird die Funktion „SensGetChangeFlag“ angeboten und funktioniert auch. (Kommen andere Werte zurück wenn ich den Sensor an und wieder abstecke)

aus

LRESULT CALLBACK _export SensFindDevice(LONG n, LPSTR szMask, PSENSDEVICE pDevice);

habe ich

long _stdcall SensFindDevice(long n, char* pszMask, char* pDevice);

gemacht. Hier bekomme ich immer “-2” zurück. Ich denke die Übergabe von Mask und Device ist falsch.

Ein Aufruf von SensReadValues scheitert mit „Stack pointer corrupt after
return from compiled function“

(Auszug Ende)

Wie kann ich das H-File auf ANSI-C Standard bringen ?
Und welchen Standard hat den das Original H-File eingentlich ?

Gruß Peter

EDIT (.h ließ sich nicht hochladen; habe es in .txt umbenennt)


Angehängte Datei(en)
.txt  UFTAccess.txt (Größe: 7,72 KB / Downloads: 0)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.05.2015, 11:20
Beitrag: #15
RE: VB DLL in VEE?
Sorry, keine Zeit bei mir....Vielleicht schon selbst weiter gekommen ?Ich installiere gerade VisualStudio 2013, dann kann ich mal schauen wenn Zeit...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:




Partnerforen: LabVIEWForum.de| DIAdem-Forum.de| Machine-Vision-Forum.de| goMatlab.de| VEEforum.de