DLL-Import / Programmierbeispiele

Antworten
abacom
Site Admin
Beiträge: 3917
Registriert: Dienstag 23. September 2008, 10:54
Kontaktdaten:

DLL-Import / Programmierbeispiele

Beitrag von abacom » Dienstag 14. Oktober 2008, 13:28

abacom
Site Admin


Anmeldungsdatum: 30.06.2006
Beiträge: 898

Verfasst am: 27.03.2007 10:11 Titel: DLL-Import / Programmierbeispiele

--------------------------------------------------------------------------------

Da sich die Programmierung von ProfiLab-DLL-Komponenten steigender Beliebtheit erfreut, wäre es sicherlich wünschenswert Programmierbeispiele für weitere Entwicklungssysteme zu haben. Leider können wir diesem Wunsch angesichts von Preis und Vielfalt der verfügbaren Compiler nur schwer nachkommen. Z.Zt. stehen folgende Programmierbeispiele zur Verfügung:

- Borland Delphi
- Borland C++ Builder
Diese sind Bestandteil der ProfiLab-Installation.

- Microsoft Visual C++ 2005
Beispiel: http://www.abacom-online.de/html/dateie ... al_c++.zip

- DEV C++ (kostenloser Open Source Compiler)
Beispiel: http://www.abacom-online.de/html/dateie ... ev_c++.zip
Compiler-Download: http://www.google.de/search?hl=de&q=Dev+C%2B%2B&meta=

(Vielen Dank Herr Arendt!)

Wir würden uns daher freuen, wenn Anwender die erfolgreich ProfiLab-Dll´s mit anderen Systemen compiliert haben, ihre Source an dieser Stelle zur Verfügung stellen. Entweder indem Sie diese selbst veröffentlichen, oder zur Veröffentlichung an ABACOM senden.

Nach oben


Giesie



Anmeldungsdatum: 05.09.2006
Beiträge: 120
Wohnort: Berlin
Verfasst am: 29.03.2007 07:16 Titel:

--------------------------------------------------------------------------------

Hallo,
eine, so glaube ich, ganz gute Beschreibung zur Erstellung einer DLL mit VB6 ist hier zu finden. http://www.activevb.de/tutorials/tut_ei ... ktdll.html
Ich habe es zwar noch nicht probiert, aber sobald ich mehr Zeit habe werde ich mich mal ran machen. Aber vielleicht ist auch jemand schneller.
_________________
Gutes Gelingen - Giesie -

Nach oben


digilemmi



Anmeldungsdatum: 28.02.2007
Beiträge: 9
Wohnort: Niederösterreich
Verfasst am: 18.04.2007 08:31 Titel:

--------------------------------------------------------------------------------

Hallo Zusammen!
Hat schon jemand eine DLL in C++ (Dev C++) programmiert, bei der auch das Konfigurationsmenü (DLLExport CConfigure) für die Eingabe von Benutzerinformationen (z.B. Variablen) verwendet wurde. Im Counterbeispiel wird hier nur die Meldung über eine MessageBox "Nichts zu konfigurieren" ausgegeben.
Ich würde gerne Variablen über das Konfigurationsmenü in Programmvariablen übergeben!
PS: Ich weiß schon, dass es hier kein C++ Programmierkurs ist, wäre aber über ein Musterbeispiel zum "Anhalten" sehr dankbar.
_________________
Gruß
digilemmi

Nach oben


abacom
Site Admin


Anmeldungsdatum: 30.06.2006
Beiträge: 898

Verfasst am: 18.04.2007 11:03 Titel:

--------------------------------------------------------------------------------

So geht´s in Delphi. In C sieht´s ähnlich aus:
viewtopic.php?t=19&highlight=dll

Zuletzt bearbeitet von abacom am 23.04.2007 13:51, insgesamt einmal bearbeitet

Nach oben


Labmaster



Anmeldungsdatum: 06.06.2007
Beiträge: 2

Verfasst am: 06.06.2007 01:19 Titel: DLL in PowerBasic

--------------------------------------------------------------------------------

Hallo,

ich verwende zwar schon länger ProfiLab (zum Akku vermessen), bin jedoch zumindest als Beitragsschreiber neu hier im Forum.

Damit ich auch einmal etwas beitragen kann, hier mal meine Version für einen ProfiLab DLL, geschrieben für PowerBasic. Speziell wird das wenn es fertig ist die Ansteuerung und Steuerung eines dicken Labor Netzgerätes (10A) als Ladegerät. Hiermit kann ich dann nicht nur Akkus beim Entladen vermessen sondern diese auch gleich automatisch wieder aufladen lassen.

Code:

'Code by Walter M. , Abacom & PowerBasic Inc.

#COMPILE DLL

%USEMACROS = 1

' ** Includes **
#IF NOT %DEF(%WINAPI)
#INCLUDE "WIN32API.INC"
#ENDIF

' ** Constants **
%IDD_DIALOG1 = 101
%IDC_TEXTBOX1 = 1001
%IDC_TEXTBOX2 = 1002
%IDC_TEXTBOX3 = 1003
%IDC_BUTTON1 = 1004

' ** Declarations **
DECLARE CALLBACK FUNCTION ShowDIALOGConfigureProc()

GLOBAL ghInstance AS DWORD

GLOBAL config1() AS STRING
GLOBAL config2() AS STRING
GLOBAL config3() AS STRING

'===============================================================================
' Main DLL entry point called by Windows...
'===============================================================================
' LIBMAIN function Purpose:
'
' User-defined function called by Windows each time a DLL is loaded into,
' and unloaded from, memory. In 32-bit Windows, LibMain is called each
' time a DLL is loaded by an application or process. Your code should
' never call LibMain explicitly.
'
' hInstance is the DLL instance handle. This handle is used by the
' calling application to identify the DLL being called. To access
' resources in the DLL, this handle will need to be stored in a global
' variable. Use the GetModuleHandle(BYVAL 0&) to get the instance
' handle of the calling EXE.
'
' fdwReason specifies a flag indicating why the DLL entry-point
' (LibMain) is being called by Windows.
'
' lpvReserved specifies further aspects of the DLL initialization
' and cleanup. If fdwReason is %DLL_PROCESS_ATTACH, lpvReserved is
' NULL (zero) for dynamic loads and non-NULL for static loads. If
' fdwReason is %DLL_PROCESS_DETACH, lpvReserved is NULL if LibMain
' has been called by using the FreeLibrary API call and non-NULL if
' LibMain has been called during process termination.
'
' Return
' If LibMain is called with %DLL_PROCESS_ATTACH, your LibMain function
' should return a zero (0) if any part of your initialization process
' fails or a one (1) if no errors were encountered. If a zero is
' returned, Windows will abort and unload the DLL from memory. When
' LibMain is called with any other value than %DLL_PROCESS_ATTACH, the
' return value is ignored.
'
'===============================================================================
FUNCTION LIBMAIN (BYVAL hInstance AS LONG, _
BYVAL fwdReason AS LONG, _
BYVAL lpvReserved AS LONG) AS LONG

SELECT CASE fwdReason

CASE %DLL_PROCESS_ATTACH
'Indicates that the DLL is being loaded by another process (a DLL
'or EXE is loading the DLL). DLLs can use this opportunity to
'initialize any instance or global data, such as arrays.

ghInstance = hInstance

DIM config1(100)
DIM config2(100)
DIM config3(100)

FUNCTION = 1 'success!

CASE %DLL_PROCESS_DETACH
'Indicates that the DLL is being unloaded or detached from the
'calling application. DLLs can take this opportunity to clean
'up all resources for all threads attached and known to the DLL.
FUNCTION = 1 'success!

CASE %DLL_THREAD_ATTACH
'Indicates that the DLL is being loaded by a new thread in the
'calling application. DLLs can use this opportunity to
'initialize any thread local storage (TLS).
FUNCTION = 1 'success!

CASE %DLL_THREAD_DETACH
'Indicates that the thread is exiting cleanly. If the DLL has
'allocated any thread local storage, it should be released.
FUNCTION = 1 'success!

END SELECT

END FUNCTION



'===============================================================================
'ProfiLab specific routines
'===============================================================================

' Das Ergebnis dieser Funktion muss einen Bytewert mit der gewünschten Anzahl von Bauteileingängen zurückliefern.
FUNCTION NumInputs SDECL ALIAS "NumInputs" () EXPORT AS BYTE

FUNCTION = 2 ' Anzahl der Eingangs pins

END FUNCTION


'Das Ergebnis dieser Funktion muss einen Bytewert mit der gewünschten Anzahl von Bauteilausgängen zurückliefern.
FUNCTION NumOutputs SDECL ALIAS "NumOutputs" () EXPORT AS BYTE

FUNCTION = 2 ' Anzahl der Ausgangs Pins

END FUNCTION



'Das Ergebnis dieser Funktion muss einen Text für die Beschriftungen jedes Eingangs (Channel) zurückliefern. Das Bauteil ruft diese Funktion für jeden Eingang (Channel) auf und fragt so die Beschriftung für jeden Eingangs-Pin ab. Der Parameter CHANNELS
'gibt an welcher Pin gemeint ist, und läuft von 0 bis NumInputs-1.
SUB GetInputName SDECL ALIAS "GetInputName" (BYVAL Channel AS BYTE, InputName AS ASCIIZ) EXPORT

SELECT CASE Channel
CASE = 0
InputName = "In blue" ' Name für Eingangs Pin 1
CASE = 1
InputName = "In green" ' Name für Eingangs Pin 2
' CASE = 2
' InputName = "In green" ' Name für Eingangs Pin 3
CASE ELSE
InputName = "not defined"
END SELECT

END SUB


'Das Ergebnis dieser Funktion muss einen Text für die Beschriftungen jedes Ausgangs (Channel) zurückliefern. Das Bauteil ruft diese Funktion für jeden Eingang (Channel) auf und fragt so (von oben nach unten) die Beschriftung für jeden Eingangs-Pin ab. Der
'Parameter CHANNELS gibt an welcher Ausgangs-Pin gemeint ist, und läuft von 0 bis NumOutputs-1.
SUB GetOutputName SDECL ALIAS "GetOutputName" (BYVAL Channel AS BYTE, OutputName AS ASCIIZ) EXPORT

SELECT CASE Channel
CASE = 0
OutputName = "Out high" ' Name für Ausgangs Pin 1
CASE = 1
OutputName = "Out medium" ' Name für Ausgangs Pin 2
CASE ELSE
OutputName = "not defined"
END SELECT

END SUB


'Dies ist die zentrale Berechnungsroutine Ihres DLL-Bauteils, die die Funktion des Bauteils definiert. Mit den Parametern PINPUT, POUTPUT und PUSER bekommt die Routine drei Zeigervariablen (Pointer) übergeben die folgende Funktion haben:
SUB CCalculate SDECL ALIAS "CCalculate" (PInput0 AS DOUBLE , POutput0 AS DOUBLE, PUser0 AS DOUBLE) EXPORT

LOCAL PInput AS DOUBLE PTR
LOCAL POutput AS DOUBLE PTR
LOCAL PUser AS DOUBLE PTR
PInput = VARPTR(PInput0)
POutput = VARPTR(POutput0)
PUser = VARPTR(PUser0)

'Berechnung, mal was leichten für den Anfang
@POutput[0] = @PUser[1] * @PInput[0] 'Ausgang1 = Config1 * Eingang1
@POutput[1] = @PUser[2] * @PInput[1] 'Ausgang2 = Config2 * Eingang2

'Todo:
'Hier soll dann die Kommunikation und die steuerung mit dem Thread stattfinden welcher per RS232 mit einem Netzgerät kommuniziert

END SUB


'Diese Routine wird beim Starten eines ProfiLab-Projekt aufgerufen, und kann z.B. benutzt werden, um Anfangswerte Ihrer DLL zu initialisieren. Die Funktion der Parameter wurde zuvor bereits beschrieben.
SUB CSimStart SDECL ALIAS "CSimStart"(PInput0 AS DOUBLE, POutput0 AS DOUBLE, PUser0 AS DOUBLE) EXPORT

LOCAL PInput AS DOUBLE PTR
LOCAL POutput AS DOUBLE PTR
LOCAL PUser AS DOUBLE PTR

PInput = VARPTR(PInput0)
POutput = VARPTR(POutput0)
PUser = VARPTR(PUser0)

'Todo:
'Von hier aus soll ein neuer Thread starten welcher eine RS232 Verbindung zu einem Netzgerät aufbaut

END SUB


'Diese Routine wird beim beenden des RUN-Modus eines ProfiLab-Projekt aufgerufen, und kann z.B. um geöffnete Dateien zu schliessen, etc.. Die Funktion der Parameter wurde zuvor bereits beschrieben.
SUB CSimStop SDECL ALIAS "CSimStop" (PInput0 AS DOUBLE, POutput0 AS DOUBLE, PUser0 AS DOUBLE) EXPORT

LOCAL PInput AS DOUBLE PTR
LOCAL POutput AS DOUBLE PTR
LOCAL PUser AS DOUBLE PTR
PInput = VARPTR(PInput0)
POutput = VARPTR(POutput0)
PUser = VARPTR(PUser0)

'Todo:
'Hier soll die RS232 Verbindung und der Thread wieder geschlossen werden

END SUB


'Sofern Ihre DLL diese Prozedur exportiert, wird die Schaltfläche EINSTELLUNGEN... im Eigenschaftendialog des DLL-Bauteils aktiviert. Wird dann diese Schaltfläche betätigt, so springt ProfiLab die CONFIGURE-Prozedur in Ihrer DLL an. Hier können Sie dann
'z.B. einen eigenen Dialog zum Konfigurieren Ihrer DLL ausführen.
SUB CConfigure SDECL ALIAS "CConfigure" (PUser0 AS DOUBLE) EXPORT

LOCAL lRslt AS LONG
LOCAL hDlg AS DWORD
LOCAL instNr AS LONG
GLOBAL PUser AS DOUBLE PTR

PUser = VARPTR(PUser0)
instNr = INT(@Puser[100])

DIALOG NEW %HWND_DESKTOP, "Please configure", 249, 107, 210, 138, TO hDlg
DIALOG SET USER hDlg, 1, instNr

CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX1, "", 15, 15, 170, 15
CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX2, "", 15, 45, 170, 15
CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX3, "", 15, 75, 170, 15
CONTROL ADD BUTTON, hDlg, %IDC_BUTTON1, "OK", 75, 105, 55, 20

CONTROL SET TEXT hDlg, %IDC_TEXTBOX1, STR$(@Puser[1])
CONTROL SET TEXT hDlg, %IDC_TEXTBOX2, STR$(@Puser[2])
CONTROL SET TEXT hDlg, %IDC_TEXTBOX3, STR$(@Puser[3])

DIALOG SHOW MODAL hDlg, CALL ShowDIALOGConfigureProc TO lRslt

@Puser[1] = VAL(config1(instNr))
@Puser[2] = VAL(config2(instNr))
@Puser[3] = VAL(config3(instNr))

'Todo:
'Der Dialog muß angepasst und erweitert werden, so das z.B. RS232 Schnittstellenparameter und dergleichen angegegben werden können.

END SUB


'------------------------------------------------------------------------------
' ** CallBacks **
'------------------------------------------------------------------------------
CALLBACK FUNCTION ShowDIALOGConfigureProc()

LOCAL instNr AS LONG
LOCAL temp AS STRING

SELECT CASE AS LONG CBMSG
CASE %WM_INITDIALOG
' Initialization handler

CASE %WM_NCACTIVATE
STATIC hWndSaveFocus AS DWORD
IF ISFALSE CBWPARAM THEN
' Save control focus
hWndSaveFocus = GetFocus()
ELSEIF hWndSaveFocus THEN
' Restore control focus
SetFocus(hWndSaveFocus)
hWndSaveFocus = 0
END IF

CASE %WM_COMMAND
' Process control notifications
DIALOG GET USER CBHNDL, 1 TO instNr
SELECT CASE AS LONG CBCTL
CASE %IDC_TEXTBOX1

CASE %IDC_TEXTBOX2

CASE %IDC_TEXTBOX3

CASE %IDC_BUTTON1
IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
CONTROL GET TEXT CBHNDL, %IDC_TEXTBOX1 TO config1(instNr)
CONTROL GET TEXT CBHNDL, %IDC_TEXTBOX2 TO config2(instNr)
CONTROL GET TEXT CBHNDL, %IDC_TEXTBOX3 TO config3(instNr)
DIALOG END CBHNDL
END IF

END SELECT
END SELECT

'Todo:
'Es sollen auch ein paar entsprechende Tasten geprüft werden, z.B. die "Enter" Taste

END FUNCTION




Vieleicht hilfts ja dem einen oder anderen weiter.
Wenn ich irgendwann dazu komme, möchte ich das auch noch mal in VisualBasic 6 machen. Hiefür muß man jedoch eine Kleinigkeit mit dem Linker tricksen, so das dieser auch DLL kompilieren kann

Viele Grüße,
Walter

Nach oben


MJB



Anmeldungsdatum: 22.08.2007
Beiträge: 2

Verfasst am: 22.08.2007 14:32 Titel: DLL zur Einbindung neuer HW über RS232, VB oder Delphi

--------------------------------------------------------------------------------

Hallo zusammen. Erster Post und gleich ein Roman
ich habe mir gerade PL besorgt und versuche unsere Messtechnik-HW (www.smmu.info) einzubinden.
Über RS232 Komponente als Makro geht es so halbwegs, aber das Protokoll ist etwas komplex.
Habe Treiber in VBA / Excel vorliegen und würde die am liebsten in DLL packen.
Der Versuch mit VB eine standard DLL zu erstellen (nach Anleitung und Beispiel .. www.vb-helper.com/howto_make_standard_dll.html ) gelang nicht ganz.
Habe das 'COUNTER' DLL-Beispiel in VB übersetzt und mit modifiziertem Linker die DLL erstellt. Aufruf vom VB Testprogramm läuft.
In PL kann ich die DLL einbinden, die exportierten Funktionen werden richtig angezeigt, aber dann stürzt PL kommentarlos ab.
Stimmt wohl was nicht. Weiss aber nicht wie zu debuggen.
Habe auch gelesen, das es nicht gehen soll aus der VB standard Dll dann Dialog aufzumachen, wie er für config benötigt wird.
Hab' mir Delphi 7 besorgt, seh' aber kein Beispiel wie die RS232 einfach anzusprechen ist (so wie VB CommCtl.ocx wäre mir am liebsten)
Gibt es jemanden der:
a) das mit einer VB DLL und PL am laufen hat?
LABMASTER / Walter vielleicht können wir uns zusammentun ?
b) eine Anbindung an RS232 in der VB-DLL hinbekommt?
wenn A geht sollte das auch machbar sein.
c) alternativ RS232 in Delphi als Beispiel hat?
ABACOM: Sie verwenden doch Delphi und RS232 - gibt es da Beispiel / Code-Fragment / Tip ??
d) sonstige Ideen ??

Kann man an Posts hier Dateien ranhängen? Wäre geschickt. Die Forum-SW unterstützt das eigentlich. So erstmal vielen Dank, dass Du überhaupt so weit gelesen hast . Grüße aus Tübingen

Code:

Attribute VB_Name = "Counter_Module"
Public Const DLL_PROCESS_DETACH = 0
Public Const DLL_PROCESS_ATTACH = 1
Public Const DLL_THREAD_ATTACH = 2
Public Const DLL_THREAD_DETACH = 3

' Visual Basic DLL-source (COUNTER.DLL)
' Defines a simple 8-Bit binary counter component for ProfiLab

Const Inputs = 2 ' number of inputs
Const Outputs = 8 ' number of outputs

' INPUTS
Const CLK = 0 ' index of input variable CLK
Const RST = 1 ' index of input variable RST

' OUTPUTS

' USER
Const CLK_old = 0 ' index user variable CLK_old
Const RST_old = 1 ' index user variable RST_old
Const Count = 2 ' index user variable COUNT


Public Function DllMain(hInst As Long, fdwReason As Long, _
lpvReserved As Long) As Boolean
Select Case fdwReason
Case DLL_PROCESS_DETACH
' No per-process cleanup needed
Case DLL_PROCESS_ATTACH
DllMain = True
Case DLL_THREAD_ATTACH
' No per-thread initialization needed
Case DLL_THREAD_DETACH
' No per-thread cleanup needed
End Select
End Function


'Type TDLLParams
' DLLValue(100) As Double 'Type of ProfiLab DLL parameters
'End Type
' PDLLParams = ^TDLLParams ' Pointer to ProfiLab DLL parameters

Function NumInputs() As Byte
'Debug.Print "in Num Inputs"
'MsgBox "in Num Inputs"
NumInputs = Inputs 'Define number of component input pins
End Function




Function NumOutputs() As Byte
'Debug.Print "in Num Outputs"
NumOutputs = Outputs 'Define number of component output pins
End Function



Function InputName(Channel As Byte) As String ' Return name for each component input pin
' Debug.Print "in InputName Channel = ", Channel
Select Case Channel
Case CLK: InputName = StrConv("CLK" & vbNullChar, vbFromUnicode) ' "CLK" (Clock)
Case RST: InputName = StrConv("/RST" & vbNullChar, vbFromUnicode) ' "/RST" (NOT RESET)
End Select
End Function


Function OutputName(Channel As Byte) As String ' Return name for each component output pin
OutputName = StrConv("Q" & Format(Channel) & vbNullChar, vbFromUnicode) '"Q0".."Q7" (Binary count)
End Function


Sub SimStart(PInput() As Double, POutput() As Double, PUser() As Double) 'called when ProfiLab enters RUN mode
Dim i As Integer
'MsgBox "in Sim STart"
PUser(Count) = 0 'RESET COUNTER
For i = 0 To Outputs
POutput(i) = 0 'Set binary outputs with COUNT=0
Next i
End Sub



Sub SimStop(PInput() As Double, POutput() As Double, PUser() As Double) 'called when ProfiLab RUN mode is terminated
' nothing to be done
'MsgBox "in Sim Stop"
End Sub


Sub Calculate(PInput() As Double, POutput() As Double, PUser() As Double) 'called regularly from ProfiLab
Dim i As Integer
Dim tmp As Integer
'MsgBox "in Calculate" & Str(PInput(0)) & " " & Str(POutput(0))
PUser(0) = 5
POutput(0) = PInput(0) + 1
If PInput(RST) <2> 2.5) And Not (PUser(CLK_old) > 2.5) Then 'check out rising edge at CLK input
PUser(Count) = PUser(Count) + 1 ' increase COUNT
If PUser(Count) > 255 Then PUser(Count) = 0 'check overflow
For i = 0 To Outputs
tmp = PUser(Count)
tmp = tmp And 2 ^ i
If tmp > 0 Then
POutput(i) = 5
Else
POutput(i) = 0 'Set binary outputs with current COUNT
End If
Next i
End If
End If
PUser(CLK_old) = PInput(CLK) 'Remember CLK status for next call
End Sub



Nach oben


abacom
Site Admin


Anmeldungsdatum: 30.06.2006
Beiträge: 898

Verfasst am: 03.09.2007 08:35 Titel:

--------------------------------------------------------------------------------

@MJB: Delphi-VCL´s gibt u.a. hier
http://www.torry.net/pages.php?id=198
Für VB sollten Sie die C-Varianten der Procs versuchen, also z.B. CCALCULATE statt CALCULATE, usw.

Nach oben


MJB



Anmeldungsdatum: 22.08.2007
Beiträge: 2

Verfasst am: 19.10.2007 16:07 Titel: DLL_Beispiel mit gemischt STRING & Number Ein-/Ausgängen

--------------------------------------------------------------------------------

Hallo Kollegen und ABACOM,

ich würde gerne eine Komponenten-DLL erstellen,
dabei aber als Ein- und Ausgänge sowohl Zahlen, als auch STRINGS verwenden, wie das auch die Makros können.

In Delphi bin ich noch ganz neu und stecke grade bei den als EXTENDED
definierten Übergabe-Arrays fest.

Wie übergebe ich String-Werte in meine Komponenten-DLL?

Z.B. den Namen eines Kommandos, das dann an mein Gerät geschickt wird.
Und den Antwortstring wieder zurück.

Ein kleines Beispiel wäre schön.

Danke, MJB

Nach oben


Mike D



Anmeldungsdatum: 03.07.2006
Beiträge: 236

Verfasst am: 19.10.2007 17:05 Titel:

--------------------------------------------------------------------------------

Strings in DLLs übergeben geht leider noch nicht, da warte ich auch drauf.
Ich habe es über DDE gelöst. Ein Beispiel stelle ich demnächst ins Netz.

Mike

Nach oben


Step



Anmeldungsdatum: 30.01.2007
Beiträge: 67

Verfasst am: 19.10.2007 18:41 Titel:

--------------------------------------------------------------------------------

Eine andere Möglichkeit (zwar nicht elegant, aber es funktioniert recht zuverlässig) ist das Abspeichern und Einlesen aus einer Datei (wenn man dann in PL einlesen will als ASCII-Datei). Das ist allerdings ein Umweg ... quasi "von hinten durch die Brust ins Auge" ...

@MJB: Falls du EXTENDED-Variablen an PL übergeben willst, solltest du bedenken, dass es sich hierbei um Variablen mit 20 signifikanten Stellen handelt und in PL nur 12 Stellen eingelesen werden ...

Stephan

Nach oben


Giesie



Anmeldungsdatum: 05.09.2006
Beiträge: 120
Wohnort: Berlin
Verfasst am: 19.10.2007 19:37 Titel:

--------------------------------------------------------------------------------

Hallo,
ich habe das mit den Strings und den 20 stelligen EXTENDED-Variablen anders gelöst. Eine DLL mit drei Ausgängen. Ich wandle in der DLL die "Zahlen" und auch Strings in ihre ACII-Werte um. An den Ausgang 1 hänge ich dann einen ASCII2String Wandler dran und danach einen Stingpuffer. Jedesmal wenn ein ASCII-Wert angelegt ist geht der Ausgang 2 auf High. Über den Ausgang 3, der nach vollständiger Ausgabe des Stings auf High geht, werden die Daten aus dem Puffer auf die Anzeige ausgegeben.
Ich hoffe das war verständlich.
_________________
Gutes Gelingen - Giesie -

Nach oben


abacom
Site Admin


Anmeldungsdatum: 30.06.2006
Beiträge: 898

Verfasst am: 12.11.2007 20:42 Titel:

--------------------------------------------------------------------------------

Mit dem Update von heute gibt es nun eine neue CalculateEx - Methode, in der auch Strings verarbeitet werden können. Beispiele in C++ und Delphi befinden sich unter ...\Neue_Funktionen\Strings\DLL\...

Nach oben


Mike D



Anmeldungsdatum: 03.07.2006
Beiträge: 236

Verfasst am: 14.11.2007 22:00 Titel:

--------------------------------------------------------------------------------

Hallo,
ein kleiner Tip für die ersten Versuche mit Strings in DLLs:
Die Namen von Pins, über die Strings geschick werden, MÜSSEN mir $ anfangen!

Function OutputName(Channel: Byte): ShortString; // Return name for each component output pin
begin
// string outputs must be named with leading '$' character!
case Channel of
str_out_1: result:='$_out_1'; //
str_out_2: result:='$_out_2'; //
end;
end;

hatte eine Weile gedauert bis ich den diesbezüglichen Komentar im Beispiel entdeckt hatte.

Mike

Nach oben


abacom
Site Admin


Anmeldungsdatum: 30.06.2006
Beiträge: 898

Verfasst am: 14.11.2007 22:43 Titel:

--------------------------------------------------------------------------------

Der Hinweis kann nicht schaden. Es steht aber auch in der Anleitung:
"Um einen Eingang/Ausgang für Strings zu verwenden muss der zugehörige Pinname mit einem '$'-Zeichen beginnen."

Nach oben


dragon



Anmeldungsdatum: 19.09.2006
Beiträge: 10

Verfasst am: 09.03.2008 11:49 Titel: DLL mit VB

--------------------------------------------------------------------------------

Hallo,

mal eine Frage hat es schon jemand geschafft eine DLL mit VB zu erstellen? Ich bekomm das nicht hin.
Die Funktionen werden übernommen aber dann wird PL einfach geschlossen.
Wenn ich die Funktion GetInputName als SUB deklariere passiert das nicht, es kommt dann aber eine Fehlermeldung.

Für Hilfe wäre ich dankbar

MfG
Dragon

------------------------------------------------------------------------------------

dragon



Anmeldungsdatum: 19.09.2006
Beiträge: 10

Verfasst am: 15.03.2008 19:04 Titel: DLL mit VB6

--------------------------------------------------------------------------------

Hallo,

Habe beide Beschreibungen ausprobiert:

http://www.activevb.de/tutorials/tut_ei ... ktdll.html
www.vb-helper.com/howto_make_standard_dll.html

Funzt aber beides nicht.
Es wird dann wohl nicht mit VB6 gehen.


Danke
Dragon

Nach oben


tlampart



Anmeldungsdatum: 06.02.2008
Beiträge: 20
Wohnort: Hülben
Verfasst am: 19.04.2008 23:22 Titel: DLL unter VB

--------------------------------------------------------------------------------

Mir ergeht es wie so vielenhier, ich bekomme eine DLL einfach nciht hin.

Ich verfüge über VB6 und sonst keine andere Programmiersprache.

Die Beispiel-DLL mit dem Counter ist eigentlich gut verständlich, den auf VB convertierten Quelltext habe ich versucht zu compilieren. geht nicht.

Was mach ich falsch, gibt es eine Anleitung speziell für Profilab udn VB6

danke für Eure Hilfe.
_________________
Sensor People
ABACOM support

Antworten

Zurück zu „DLL-Programmierung“