DLL richtig verwenden?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: DLL richtig verwenden?

Beitrag von edel »

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.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: DLL richtig verwenden?

Beitrag von mk-soft »

Der Header Importer kommt mit der Datei nicht klar. Die Konstanten und Structuren werden übersetzt. Nur die Funktionen nicht.
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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: DLL richtig verwenden?

Beitrag von Kiffi »

mk-soft hat geschrieben:P.S. Wenn diese mit VB6 zu verwenden geht dann hat die DLL nicht mit dotnet zu tun.
doch, hat sie. Ich saug es mir ja schließlich nicht aus den Fingern.

http://www.mhj-software.com/DownLoad/Ha ... vS7-V6.pdf

Kapitel 3.4: C#

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: DLL richtig verwenden?

Beitrag von The_Dark_Zim-.- »

^^ okey ich guck mir das mal an, kann ja nur schief gehen XD

Thx so far :P
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: DLL richtig verwenden?

Beitrag von edel »

mk-soft hat geschrieben:Der Header Importer kommt mit der Datei nicht klar. Die Konstanten und Structuren werden übersetzt. Nur die Funktionen nicht.
Auszug
Das sollte sehr einfach sein :

Code: Alles auswählen

importc "hierdielib"
   _MPI_A_Einleitung_RS232(*Handle,ComNr,BaudRate,PGMPIAdresse,HoechsteMPI, *SchnittstelleWarSchonAllokiert,*Error)
  [...]
endimport
usw.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: DLL richtig verwenden?

Beitrag von The_Dark_Zim-.- »

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
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
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?

Beitrag von ts-soft »

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
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: DLL richtig verwenden?

Beitrag von The_Dark_Zim-.- »

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
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
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?

Beitrag von ts-soft »

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.
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Re: DLL richtig verwenden?

Beitrag von Rings »

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:

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
Antworten