DLL richtig verwenden?
Re: DLL richtig verwenden?
Am besten nimmst du die DLL aus dem Ordner "Example Visual C V6", die Headerdatei kannste auch gleich nach pb portieren.
Die C DLL passen besser zu PB als jede andere Version.
Die C DLL passen besser zu PB als jede andere Version.
Re: DLL richtig verwenden?
Der Header Importer kommt mit der Datei nicht klar. Die Konstanten und Structuren werden übersetzt. Nur die Funktionen nicht.
Auszug
?
Auszug
Code: Alles auswählen
extern "C" {
//
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_RS232(int* Handle, int ComNr, long BaudRate, BYTE PGMPIAdresse, BYTE HoechsteMPI, bool* SchnittstelleWarSchonAllokiert, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_NetLink(int* Handle, char* _IPAdresseStr, BYTE PGMPIAdresse, BYTE HoechsteMPI, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_NetLinkPro(int* Handle, char* _IPAdresseStr, BYTE PGMPIAdresse, BYTE HoechsteMPI, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_NetLinkPro_TCP_AutoBaud(int* Handle, char* IPAdresseStr, BYTE PGMPIAdresse, BYTE HoechsteMPI, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_NetLinkPro_TCP_SelectBaud(int* Handle, char* IPAdresseStr, BYTE PGMPIAdresse, BYTE HoechsteMPI, bool IstProfibusDP, WORD VorgabeBaudrate, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_TCP_IP_Direct(int* Handle, char* IPAdresseStr, int CPUSlotNr, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_SimaticNet(int* Handle, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_GetErreichbareTeilnehmer(int Handle, int *Teilnehmer, int* AnzahlTeilnehmer, WORD* Error);
//
__declspec(dllexport) bool __cdecl _MPI_A_SetRoutingData(int Handle,
BYTE ZielBaugruppeSlotNr, BYTE ZielBaugruppeRackNr, BYTE ZielBaugruppeMPI_DP_Adresse,
char* ZielBaugruppeIPAdresseStr, WORD ZielSubnetzID_High, WORD ZielSubnetzID_Low,
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: DLL richtig verwenden?
doch, hat sie. Ich saug es mir ja schließlich nicht aus den Fingern.mk-soft hat geschrieben:P.S. Wenn diese mit VB6 zu verwenden geht dann hat die DLL nicht mit dotnet zu tun.
http://www.mhj-software.com/DownLoad/Ha ... vS7-V6.pdf
Kapitel 3.4: C#
Grüße ... Kiffi
a²+b²=mc²
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: DLL richtig verwenden?
^^ okey ich guck mir das mal an, kann ja nur schief gehen XD
Thx so far :P
Thx so far :P
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Re: DLL richtig verwenden?
Das sollte sehr einfach sein :mk-soft hat geschrieben:Der Header Importer kommt mit der Datei nicht klar. Die Konstanten und Structuren werden übersetzt. Nur die Funktionen nicht.
Auszug
Code: Alles auswählen
importc "hierdielib"
_MPI_A_Einleitung_RS232(*Handle,ComNr,BaudRate,PGMPIAdresse,HoechsteMPI, *SchnittstelleWarSchonAllokiert,*Error)
[...]
endimport
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: DLL richtig verwenden?
Also irgentwie komme ich nicht weiter.. gibt es da kein gutes Tutorial für. Und was ist dieses "Header Importer" ? Brauch ich das ?
Wäre nett wenn einer ein kleines Beispiel hat ^^
Gruß Zim
Wäre nett wenn einer ein kleines Beispiel hat ^^
Gruß Zim
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: DLL richtig verwenden?
Headerimporter erspart einem zwar etwas schreibarbeit, aber das Ergebnis ist im allg. ohne
Korrekturen nicht anwendbar.
Du mußt also alle Konstanten in der C++ Headerdatei nach PB übertragen, sowie alle
Strukturen. Dann Importierst Du die Funktionen, wobei wieder bei den Variablen Typen
die entsprechenden PB Pendants zu wählen sind.
Ohne Grundkenntnisse in C wird das nichts werden. Gemeint sind hier aber nur die
minimalsten Grundlagen in C, hat man in wenigen Tagen gelernt, vor allem wenn man
viel mit der WinAPI arbeitet, wo ja auch alles in C dokumentiert ist.
Tutorial gibts da keins und wirds wohl nie geben. Beispiele gibts wie Sand am mehr,
aber ohne C-Grundkenntnisse wirste das nicht verstehen.
Gruß
Thomas
Korrekturen nicht anwendbar.
Du mußt also alle Konstanten in der C++ Headerdatei nach PB übertragen, sowie alle
Strukturen. Dann Importierst Du die Funktionen, wobei wieder bei den Variablen Typen
die entsprechenden PB Pendants zu wählen sind.
Ohne Grundkenntnisse in C wird das nichts werden. Gemeint sind hier aber nur die
minimalsten Grundlagen in C, hat man in wenigen Tagen gelernt, vor allem wenn man
viel mit der WinAPI arbeitet, wo ja auch alles in C dokumentiert ist.
Tutorial gibts da keins und wirds wohl nie geben. Beispiele gibts wie Sand am mehr,
aber ohne C-Grundkenntnisse wirste das nicht verstehen.
Gruß
Thomas
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: DLL richtig verwenden?
Oo das kann doch nicht so schwer sein eine DLL zu verweden ...
Also nochmal, Ich hab eine DLL von MHJ-Software, namens "MPIA32_V60_VB.dll". Die habe ich für Visual Basic, Delphi und C oder C++. Dann hab ich noch die Declaration der Befehle.
Ich habe jetzt das Problem das ich nicht weis wie ich die Antworten der DLL bekomme. Das kann doch eingentlich nicht so schwer sein ? Gibt es überhaupt ein Unterschied bei den DLL's ? Müsste das nicht mit allen gehen ?
Gruß Zim
Also nochmal, Ich hab eine DLL von MHJ-Software, namens "MPIA32_V60_VB.dll". Die habe ich für Visual Basic, Delphi und C oder C++. Dann hab ich noch die Declaration der Befehle.
Ich habe jetzt das Problem das ich nicht weis wie ich die Antworten der DLL bekomme. Das kann doch eingentlich nicht so schwer sein ? Gibt es überhaupt ein Unterschied bei den DLL's ? Müsste das nicht mit allen gehen ?
Gruß Zim
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: DLL richtig verwenden?
Es gibt normalle windows DLLs = stdcall, dann gibts die unter C üblichen mit CDECL Konventionen.
Desweiteren gibts ActiveX DLLs für VB, Delphie usw., sowie welche für .NET und noch andere.
Das einfachste wäre die Verwendung der DLL für C. Die Funktionen importieren,
evtl. Strukturen und Konstanten definieren und dann kannste loslegen. Ist nicht
schwer. Aber Grundkenntnisse in C wären schon notwendig.
Aber ich werde mir das jetzt nicht installieren um an die notwendige DLL und die
Header-Dateien zu kommen, zu mal ich dann mangels Hardware trotzdem nicht testen
kann.
Desweiteren gibts ActiveX DLLs für VB, Delphie usw., sowie welche für .NET und noch andere.
Das einfachste wäre die Verwendung der DLL für C. Die Funktionen importieren,
evtl. Strukturen und Konstanten definieren und dann kannste loslegen. Ist nicht
schwer. Aber Grundkenntnisse in C wären schon notwendig.
Aber ich werde mir das jetzt nicht installieren um an die notwendige DLL und die
Header-Dateien zu kommen, zu mal ich dann mangels Hardware trotzdem nicht testen
kann.
Re: DLL richtig verwenden?
ich habe ne sps, einen alten seriellen Adapter,
also hab ichs mal grad übersetzt.
ist wirklich einfach, beachte die VB6 deklarationen und
dann mein PB-Befehl dazu .
Das ganze ist ohne Prototypen gemacht,
klassisch halt:
also hab ichs mal grad übersetzt.
ist wirklich einfach, beachte die VB6 deklarationen und
dann mein PB-Befehl dazu .
Das ganze ist ohne Prototypen gemacht,
klassisch halt:
Code: Alles auswählen
; TEST MHJ DLL MPI Seriell
; S.Rings, march 2010
;library öffnen
sMPILIB_NAME.s="mpia32_v60_vb.dll"
iLib=OpenLibrary(#PB_Any,sMPILIB_NAME)
If iLIB
Debug iLIB
MPIHandle.l
;Declare Function MPI6_OpenRS232 _
;Lib "mpia32_v60_vb.dll" (ByRef Handle As Long, ByVal ComNr As Long, ByVal BaudRate As Long, _
;ByVal PGAddress As Byte, ByVal HighestAddress As Byte, ByRef ComWasAlreadyUsed As Long, _
;ByRef Error As Integer) As Long
MPIHandle.l
ComNr.l=1
BaudRate.l=19200
PGMPIAdresse.b=0
HoechsteMPI.b=31
SchnittstelleWarAllokiert.l=0
MyError.l
Ret_Value.l = CallFunction(iLib,"MPI6_OpenRS232",@MPIHandle, ComNr, BaudRate, PGMPIAdresse, HoechsteMPI, @SchnittstelleWarAllokiert, @MyError)
Debug ret_Value
Debug Myerror
If myerror=0 And ret_Value=1
;Declare Function MPI6_ConnectToPLC _
;Lib "mpia32_v60_vb.dll" (ByVal Handle As Long, ByVal PlcAddress As Byte, ByRef Error As Integer) As Long
AGMPIAdresse=2 ;MPI-Adresse SPS = 2
Ret_Value.l = CallFunction(iLib,"MPI6_ConnectToPLC",MPIHandle, AGMPIAdresse, @MyError)
If Ret_Value
Debug "Verbindung zum AG wurde aufgebaut!"
KommunikationAufgebaut = 1
Else
Debug "Fehler beim Aufbauen der Verbindung zum AG!"
KommunikationAufgebaut = 0
EndIf
If KommunikationAufgebaut
;Das mit den (st)rings geht irgendwie nicht
;Declare Function MPI6_GetOrderNrPlc _
;Lib "mpia32_v60_vb.dll" (ByVal Handle As Long, ByVal OrderNrStr As String, ByRef Error As Integer) As Long
mem=AllocateMemory(255)
Ret_Value = CallFunction(iLib,"PI6_GetOrderNrPlc",MPIHandle,@mem, @MyError)
Debug mem
If ret_value
Debug PeekS(mem);BestellNrString
Debug mem
Else
Debug ret_Value
Debug Myerror
ErrorString.s=Space(256)
Ret_Value = CallFunction(iLib,"MPI_A_GetDLLError",MPIHandle, @ErrorString, @MyError)
Debug errorstring
EndIf
If mem : FreeMemory(mem):EndIf
;Inhalt von DB10 auslesen
;Declare Function MPI_A_ReadDBWort _
;Lib "mpia32_v60_vb.dll" (ByVal Handle As Long, _
;ByVal Von As Integer, ByVal AnzahlWorte As Integer, _
;ByRef StatusBuffer As Integer, ByVal DBNummer As Integer, _
;ByRef Error As Integer) As Long
For I=1 To 10
Von.w = 0
AnzahlWorte.w = 10
DBNummer.w = 10
StatusBuffer.w
mem=AllocateMemory(AnzahlWorte*2)
ret_value= CallFunction(iLib,"MPI_A_ReadDBWort",MPIHandle, Von, AnzahlWorte, mem, DBNummer, @rError)
If myerror=0
Debug Str(PeekW(mem)) +"," + Str(PeekW(mem+2)) +"," + Str(PeekW(mem+4)) +"," + Str(PeekW(mem+6))
Else
Debug ret_Value
Debug Myerror
EndIf
If mem : FreeMemory(mem):EndIf
Next
;Beenden
;Declare Function MPI6_CloseCommunication _
;Lib "mpia32_v60_vb.dll" (ByVal Handle As Long, ByRef Error As Integer) As Long
Ret_Value = CallFunction(iLib,"MPI6_CloseCommunication",MPIHandle, @MyError)
Debug "Kommunikation wurde beendet!"
EndIf
EndIf
CloseLibrary(iLIB)
Else
MessageRequester("ACHTUNG","LIBRARY KANN NICHT GEÖFFNET WERDEN",0)
EndIf
Rings hat geschrieben:ziert sich nich beim zitieren