Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

Header-datei für DLL erstellen, lib ist vorhanden.

ShortCircuit / 4 Antworten / Baumansicht Nickles

Problem:

Ich habe eine DLL (GSSocket.dll) ohne *.lib und ohne *.h File.

Erstes Problem gelöst (hoffe ich):
GSSocket.lib habe ich mittels ImpLib32 erstellt (alternativ über /dumpbin und /lib).

Zweites Problem (und ich bin einfach keine Programmierleuchte):
Wie sieht mein Header-File aus?
Folgende Infos habe ich:


*** GSSocket COM Component ***

The GSSocket.dll is a COM based dll used to provide ASP with some Sockets API functionality.

Installation:
*******************************************************************************************

This COM dll works with IIS and PWS (versions that support ASP). If you have never
installed an ASP based COM dll, follow these instructions:

1. Click on the Windows "Start" button.

2. Click on the "Run..." menu item.

3. Determine the path to "regsvr32.exe". (ie: c:\\windows\\system\\inetsrv\\regsvr32.exe)

4. Determine the path to "GSSocket.dll". (ie: c:\\foo\\GSSocket.dll)

5. Type the path to "regsvr32.exe", a space, then the path to "GSSocket.dll" and then click
the "OK" button. As an example, if your path to your GSSocket COM was "c:\\foo\\GSSocket.dll" and
the path to "regsvr32.exe" was "c:\\windows\\system\\inetsrv\\regsvr32.exe" you would type
"c:\\windows\\system\\inetsrv\\regsvr32.exe c:\\foo\\GSSocket.dll" in the "Run..." dialog. On most
systems you will not need to determine the path of "regsvr32.exe" if the PATH environment
variable is set for the directory that contains it. In this case you simply can type
"regsvr32.exe c:\\foo\\GSSocket.dll" in the "Run.." dialog.


Component Details:
*******************************************************************************************
OBJECT: GSSocket

INTERFACE: GSSocket.TCPSock

METHODS:
-------------------------------------------------------------------------------------------
Return Value Method Name Parameters Purpose
-------------------------------------------------------------------------------------------
String Connect strAddress, PortNum Connect to a listening socket.
String Send strBuffer Sends data in strBuffer.
String Recv none Returns any data received.
none Close none Closes the TCP connection.

INTERFACE: GSSocket.UDPSock

METHODS:
-------------------------------------------------------------------------------------------
Return Value Method Name Parameters Purpose
-------------------------------------------------------------------------------------------
String Send strAddr, PortNum, strBuffer Send UDP data.
String Recv strAddr, PortNum Returns any received UDP data.

Usage Example (VBScript):
*******************************************************************************************


Result = ""
Data = ""

\'Create a TCPSock object.
Set tcp = Server.CreateObject("GSSocket.TCPSock")

\'Could use an IP or hostname string for the address.
Result = tcp.Connect("10.1.7.2", 1234)

If Result "OK" Then
Response.Write(Result & "
")
End If

\'Send some data...
Result = tcp.Send("My data is this string.")

If Result "OK" Then
Response.Write(Result & "
")
End If

\'Receive data that is returned, if the remote host actually returns anything!.
Result = tcp.Recv

If InStr(Result, "ERROR:") Then
Response.Write(Result & "
")
Else
Data = Result
End If

tcp.Close

Set tcp = Nothing
%>






Drittes Problem:
Das Headerfile wird mittels include in mein c-file eingebunden.
Kann ich dann ganz normal mit

GSSocket.UDPSock.Send(IP, PORT, Message),

diese Funktion nutzen?

Dumme fragen, ich weiss....

Kann jemand helfen
Danke
Jens
bei Antwort benachrichtigen
thomas woelfer ShortCircuit „Header-datei für DLL erstellen, lib ist vorhanden.“
Optionen

hi.

naja, generell ist es so das man nur mit einer dll allein nicht viel anfangen kann - schon allein deshalb weil die calling conventions fuer die eintrittspunkte in dlls nicht standartisiert sind. wenn implib funktioniert, dann hast du eine dll die mit einem compiler/linker erzeugt wurde die mit dem sdk compiler kompatibel ist - und dann ist die nutzung auch in der theorie moeglich. damit ist 1.) schon durchaus richtig - nur der voellig falsche weg.

zu 2.) - deinem headerfile. das koennte man prinzipiell bauen wenn es sich um eine 'normale' dll handelt - aber in diesem fall handelt es sich um eine dll dir fuer den transport eines com objektes zustaendig ist. das bedeutet, das die information darueber entweder in form einer typelibrary vorliegen muessen, oder aber zur laufzeit erfragt werden muessen - so funktioniert com nunmal. wie das objekt aussieht ist ja beschrieben... mal angenommen du wuerdest aus der beschreibung der methoden ein headerfile zusammenbauen in dem funktionen drin stehen: wuerde es dann gehen? - nein, das wuerde es nicht. die methoden sind naemlich methoden eines objektes und eben keine funktionen die du einfach per c aufrufen kannst. das fuehrt dann auch zu 3.)

ne, geht nicht. was du tun musst ist das objekt mit CoCreateInstance() zu erzeugen. dann kuemmert sich die com library drum das so eine instanz erzeugt wird. _die_ kannst du dann mit queryinterface nach ihren interface fragen, und von denen kannst du dann die methode aufrufen.

das ist in reinem c allerdings realtiv unschoen, weil man da vollstaendig auf die com library zurueckgreifen muss.

wenn du hingegen irgendein tool wie zum beispiel vc++ einsetzt, dann kannst du die dll per #import importieren - der compiler erzeugt dann wrapper-klassen - und diese dann benutzen. alterantiv kannst du die com helper (wie z.b. atl) benutzen um eine instanz dieses objektes zu erzeugen: mit reinem c ohne jede hilfe wird das ein bisschen _sehr_ unhandlich.

WM_HOPETHISHELPS
thomas woelfer

this posting contains no tpyos.
bei Antwort benachrichtigen
ShortCircuit thomas woelfer „so einfach ist das nicht“
Optionen

Hallo Thomas,

danke erst mal für deine Antwort. D.h. ich brauch in der Richtung nicht weiter zu pfriemeln...

Zu der Problemlösung:
Ich benutze VC++6.0 (ich weiss, overkill für meine Bedürfnisse...).
So, nun weitere dumme Fragen, da meine Bekannten leider alle nur (Schmalspur)-C programmieren und mir da nicht weiterhelfen können.

ich binde die DLL direkt über
#import GSSocket.dll
ein und kann dann z.B. per

tcpsock=CoCreateInstance(GSSocket.TCPSock)
und
Result = tcpsock.Connect("10.1.7.2", 1234)

weitermachen?
WIe ich befürchte, wird es nicht so einfach sein...erste Versuche sind fehlgeschlagen?

Wenn du vielleicht noch einen Tipp hast, wo ich dazu was nachlesen könnte, wäre ich dir sehr dankbar.

Gruss
Jens

bei Antwort benachrichtigen
thomas woelfer ShortCircuit „Hallo Thomas, danke erst mal für deine Antwort. D.h. ich brauch in der Richtung...“
Optionen

wenn du #import verwendest, dann muss es kein cocreate instance sein, denn #import erzeugt eine wrapper (c++) klasse die man einfach verwenden kann. am besten liest du dazu die online docu zu #import und schaust dir die 'com compiler support' texte in der online-hilfe an.

WM_HOPETHISHELPS
thomas woelfer

this posting contains no tpyos.
bei Antwort benachrichtigen
ShortCircuit thomas woelfer „mit vc6 ist das einfach“
Optionen

Argh, scheinabr ist die letzte Message ins datennirvana...

Also, das mit #import hat hingehauen, die files *.tlh und *.tli wurden erstellt.
Aber ich bin immer noch zu doof, um auf die Funktionen der Dll zugreifen zu können, eine normale *.h header datei brauch ich jetzt ja nicht mehr, wenn ich die doku richtig gedeutet habe.
Ich wühl mich mal weiter durch die doku...
Wie gut, dass ich kein Informatiker geworden bin... :)

Gruss
Jens

bei Antwort benachrichtigen