Seite 1 von 4

klassische com dll oder .NET?

Verfasst: 21.04.2009 12:15
von heiße Luft
Hallo Allerseits,

ich möchte Daten von einer SPS auslesen und evlt. wieder auf die SPS speichern.
Der Hersteller liefert 2 DLL Dateien mit. Eine mit klassischen COM Funktionen und eine für .NET.
Kann ich von PureBasic aus auch die .NET Funktionen nutzen?
Von VS-Basic aus geht beides (is ja klar).
Die DLL mit den klassischen Funktionen habe ich mit OpenLibrary öffnen können.

Grüße heiße Luft

Verfasst: 21.04.2009 12:22
von Kaeru Gaman
Moin moin und Willkommen an Board!

meintest du mit "SPS" jetzt eine PSone oder PS2... oder ist das ein Typo und du meinst eine PSP?

... du wirst ja wohl kaum das SPS meinen... :mrgreen:

krgds
Dah Olde Frog

Verfasst: 21.04.2009 12:51
von - chris -
SPS -> speicher programmierbare steuerung ?

Wenn es sich dabei um eine Siemens-Steuerung handelt.

z.B.: Prodave von Siemens oder libnodave

http://sourceforge.net/projects/libnodave

funktioniert beides mit PureBasic.

Re: klassische com dll oder .NET?

Verfasst: 21.04.2009 13:09
von Kiffi
heiße Luft hat geschrieben:Die DLL mit den klassischen Funktionen habe ich mit OpenLibrary öffnen können.
dann ist das aber keine COM-DLL (so wie Du im Betreff erwähnst).

.Net-DLL + PureBasic -> Geht (derzeit) nicht

.Net-DLL (mit COM-Export) + PureBasic + COMate -> Geht

COM-DLL + PureBasic + COMate -> Geht

Klassische DLL + PureBasic + OpenLibrary -> Geht

Grüße ... Kiffi

Verfasst: 21.04.2009 13:25
von heiße Luft
SPS ja "Speicher Programmierbare Steuerung"
in meinem Fall eine PP41 von B&R (wenn es jemanden was sagt)

@Kifi
was ist der Unterschied zwischen einer klassischen und einer COM DLL ?

.Net-DLL (mit COM-Export) + PureBasic + COMate
kannst Du mir dazu noch ein paar Worte sagen ?

Grüße
heiße Luft

nachtrag

Verfasst: 21.04.2009 14:08
von heiße Luft
also wenn ich diesen Code nehme

Code: Alles auswählen

If OpenLibrary(0,"PviCOM.dll")
  lib_laden_ok.b = 1
  AnzahlFunktionen.l = CountLibraryFunctions(0)
  Debug "Anzahl der Funktionen:"+Str(AnzahlFunktionen)
  If ExamineLibraryFunctions(0)
    While NextLibraryFunction()
      Debug "Name der Funktion: "+LibraryFunctionName()
      Debug "Adresse der Funktion:"+Str(LibraryFunctionAddress())
    Wend
  EndIf     
EndIf
If lib_laden_ok = 0 
   Debug "dll konnte nicht geladen werden"
  Else
   Debug "dll wurde geladen"
EndIf
    
CloseLibrary(0)
dann bekomme ich folgende Ausgabe (gekürzt)

Anzahl der Funktionen:67
Name der Funktion: ?PviServerClient@@YAHPAKH@Z
Adresse der Funktion:268461952
Name der Funktion: ?PviServerDeinitialize@@YAXXZ
Adresse der Funktion:268461808
Name der Funktion: ?PviServerGetClientInfo@@YAKPAXK@Z
Adresse der Funktion:268461888
Name der Funktion: ?PviServerGetRequest@@YAHPAPAUT_SVC_HEAD@@PAPAE@Z
Adresse der Funktion:268461856
Name der Funktion: ?PviServerInitialize@@YAHPAUHWND__@@KKPBDK@Z
Adresse der Funktion:268461760
Name der Funktion: ?PviServerPutResponse@@YAXPAUT_SVC_HEAD@@PAE@Z
Adresse der Funktion:268461824
Name der Funktion: ?PviServerRegistry@@YAKHPADK@Z
Adresse der Funktion:268461920
Name der Funktion: ?PviTestClient@@YAXPAK@Z
Adresse der Funktion:268462000
Name der Funktion: PviChgLink
Adresse der Funktion:268459424
Name der Funktion: PviChgLinkRequest
Adresse der Funktion:268459312
.
.
.
Name der Funktion: PviXWriteResultResponse
Adresse der Funktion:268461472
dll wurde geladen

wenn das funktioniert ist es eine klassische dll?

Grüße
heiße Luft

Verfasst: 21.04.2009 14:18
von Kiffi
heiße Luft hat geschrieben:@Kifi
was ist der Unterschied zwischen einer klassischen und einer COM DLL ?
platt gesagt:

Auf die Funktionen einer klassischen DLL kann man 'aus dem Stand' (also
nativ) mit PB via OpenLibrary() und CallFunction(Fast)() zugreifen.

Um auf die Funktionen einer COM-DLL zuzugreifen, bedarf es in PB schon
wesentlich mehr Gehirnschmalz und Aufwand. Glücklicherweise gibt es
COMate oder den PureDispHelper, die die nötigen
COM-Zugriffsfunktionalitäten 'wrappen'.
heiße Luft hat geschrieben:.Net-DLL (mit COM-Export) + PureBasic + COMate
kannst Du mir dazu noch ein paar Worte sagen ?
auf .Net-DLLs kann (wie geschrieben) von PB aus nicht zugegriffen
werden (zumindest ist das der aktuelle Stand der Dinge); weder mit
OpenLibrary() noch mittels COM, weil die entsprechenden Schnittstellen
fehlen. Der Programmautor kann nun jedoch mittels COM Interop eine
Schnittstelle in seine DLL einbauen, damit sie mittels COM angesprochen
werden kann (dann wieder mit COMate (siehe oben)). Ich bezweifle
jedoch, dass Deine .Net-DLL über eine entsprechende Schnittstelle
verfügt.

Grüße ... Kiffi (mit 2 'f' ;-))

// Edit:
heiße Luft hat geschrieben:wenn das funktioniert ist es eine klassische dll?
Japp, isses.

Verfasst: 21.04.2009 14:40
von heiße Luft
Danke für die super schnellen Antworten.
Das kommt ja manch professioneller Support nicht mit.

:allright:

Grüße
heiße Luft

Verfasst: 21.04.2009 14:45
von helpy
heiße Luft hat geschrieben:SPS ja "Speicher Programmierbare Steuerung"
in meinem Fall eine PP41 von B&R (wenn es jemanden was sagt)

@Kifi
was ist der Unterschied zwischen einer klassischen und einer COM DLL ?

.Net-DLL (mit COM-Export) + PureBasic + COMate
kannst Du mir dazu noch ein paar Worte sagen ?

Grüße
heiße Luft
... cool ... ein PP41:

Bild

In der PVI Doku steht folgendes über die PviCOM Schnittstelle:
PVICOM Schnittstelle

Die PVICOM Schnittstelle (Client Schnittstelle) stellt den Zugang zum PVI auf der untersten Ebene her.

Sie stellt damit die "engste" und bezüglich Performance optimalste PVI Schnittstelle dar. Die PVICOM Schnittstelle wird auch von allen anderen Windows-basierenden Komponenten mit PVI Zugang (PVIOPC, PVIDDE, PVI-Services usw.) verwendet.

Die Kommunikation über die PVICOM Schnittstelle wird mit Hilfe der Funktionen der PVI Kommunikations-Library "PviCom.dll" abgewickelt. Die PVI Kommunikations-Library ist eine DLL (dynamic link library) nach dem Windows-Standard. Verwenden Anwendungen (Applikationen) Funktionen einer DLL, muss die DLL explizit geladen und die Funktionen müssen deklariert werden oder die statische Library "PviCom.lib" zum Programm gebunden (implizit laden) werden. Die Vorgangsweise ist den jeweiligen Programmier-Handbüchern zu entnehmen.

Folgende Entwicklungsumgebungen werden unterstützt:

Visual C++ (ab Version 6.0)
Visual Basic (ab Version 6.0)
Borland C++ Builder (ab Version 3)
Borland Delphi (ab Version 4)
Dateien der PVICOM Schnittstelle:

PviCom.dll PVI Kommunikations-Library.
PviCom.lib Statische Library für Visual C.
PviCom.h Definitionsdatei (Include File) für Visual C.
PviCom.bas Definitionsdatei (Include File) für Visual Basic.
PviCom.pas Definitionsdatei (Include File) für DELPHI.

Die PVICOM Definitionsdatei beinhaltet die Definitionen bzw. Deklarationen aller Funktionen der PVICOM Schnittstelle, der verwendeten Strukturen und Typen sowie der PVI Konstanten.
Die PviCom.dll ist nach diesem Text keine COM Dll sondern eine "DLL (dynamic link library) nach dem Windows-Standard". Das "Com" im Namen der Dll (PviCom.dll) steht einfach nur für Communication (Kommunikation). Und PVI bedeutet: Process Visualization Interface

Hier ein Auszug aus der Funktionsbeschreibung von PviInitialize und PviXInitialize:
Funktion PviInitialize, PviXInitialize
Definition für C/C++

Code: Alles auswählen

int PviInitialize (INT Timeout, INT RetryTime, LPCSTR pInitParam, LPVOID pRes)

int PviXInitialize (LPDWORD phPvi, INT Timeout, INT RetryTime, LPCSTR pInitParam, LPVOID pRes)
Definition für Basic

Code: Alles auswählen

PviInitialize (ByVal Timeout As Long, ByVal RetryTime As Long, ByVal pInitParam As String, ByVal pRes As Long) As Long

PviXInitialize (ByRef phPvi As Long, ByVal Timeout As Long, ByVal RetryTime As Long, ByVal pInitParam As String, ByVal pRes As Long) As Long
...
Vielleicht hilft Dir das ja weiter,
cu, helpy

Verfasst: 21.04.2009 16:19
von Andesdaf
von mir auch willkommen an Board, Matrose heiße Luft :wink: