• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

c# dll funktion aufrufen/definieren

BLACKDIMMU

Spiele-Enthusiast/in
Mitglied seit
18.05.2003
Beiträge
1.018
Reaktionspunkte
0
hi

ich bin jetzt zu visual c# gekommen
und will eine funktion aus einer dll (die nicht von mir stamd) aufrufen
grob gesagt wie mache ich das?
also die funktion sollte in einer klasse definiert werden
so weit bin ich schon
aber wie weiter?
also das soll passieren:

das program soll die dll ansprechen,
die wiederum das angeschlossene interface fragt welche seriennummer es hat

und diese seriennummer gibt die dll weiter an das program, die in einem "platzhalter"/funktion gespeichert

also wie spreche ich nun die dll an, und übermittler ihr das sie die funktion GetAllConnectedInterfaces
ausführen soll?

hmm ich hoffe ich konnte verständlich machen was ich machen will
 
Du kopierst die DLL in einen BIN Unterordner deines Projekts und fügst sie dann noch als Ressource zum Projekt hinzu.

Dann kannst du alle darin enthaltenen Funktionen über den Object Browser ansehen und im normalen Quellcode über den vollen Namensraumpfad ansprechen.
 
skicu am 30.04.2007 16:42 schrieb:
Du kopierst die DLL in einen BIN Unterordner deines Projekts und fügst sie dann noch als Ressource zum Projekt hinzu.

Dann kannst du alle darin enthaltenen Funktionen über den Object Browser ansehen und im normalen Quellcode über den vollen Namensraumpfad ansprechen.

hmm *probieren..... nix finden*
also ich benutze die eingedeutschte version von viual c# express
und ich vermute das die dll mit einer anderen sprache geschrieben wurde (was doch eigenlich egal ist oder?)

sorry das hätte ich davor noch schreiben sollen
 
Das ist egal.

Du hast doch irgendwo in Dokumente und Einstellungen\User\... ein Verzeichnis, in dem dein Projekt liegt?
Darin erstellst du ein "BIN" Verzeichnis und kopierst die dll dahinein.

In Visual Studio englisch gibts einen Punkt, wenn du rechts auf dein Projekt klickst, namens "Add Ressource" - nehme mal an, dass das im deutschen dann "Ressource hinzufügen" oder ähnlich heißt. Hier wählst du dann den Pfad, in dem deine dll dann liegt (der Projektpfad) und fügst damit die Datei dann dem Projekt hinzu.
 
skicu am 30.04.2007 17:16 schrieb:
Das ist egal.

Du hast doch irgendwo in Dokumente und Einstellungen\User\... ein Verzeichnis, in dem dein Projekt liegt?
Darin erstellst du ein "BIN" Verzeichnis und kopierst die dll dahinein.

In Visual Studio englisch gibts einen Punkt, wenn du rechts auf dein Projekt klickst, namens "Add Ressource" - nehme mal an, dass das im deutschen dann "Ressource hinzufügen" oder ähnlich heißt. Hier wählst du dann den Pfad, in dem deine dll dann liegt (der Projektpfad) und fügst damit die Datei dann dem Projekt hinzu.
Theoretisch müsste man sich den ersten Schritt (kopieren ins BIN-Verzeichnis) auch sparen können und die Ressource von einem anderen Ort aus einbinden können, die wird dann beim kompilieren automatisch ins BIN-Verzeichnis kopiert.
Den "Add Reference"-Menüpunkt gibts übrigens auch im Menü unter "Projekt".
 
DJ_of_Borg am 30.04.2007 18:33 schrieb:
Theoretisch müsste man sich den ersten Schritt (kopieren ins BIN-Verzeichnis) auch sparen können und die Ressource von einem anderen Ort aus einbinden können, die wird dann beim kompilieren automatisch ins BIN-Verzeichnis kopiert.
Den "Add Reference"-Menüpunkt gibts übrigens auch im Menü unter "Projekt".
Ok, das kann sein. Ich arbeite eigentlich nur mit ASP.NET Projekten und dort würde dann auf die andere Datei nur verlinkt - da ist kopieren dann schon sinnvoll...
 
ok ich konnte die dll nun ohne fehlermeldung einbinden, als ellement wenn ich mich recht erinnere
nur nach funktionen druchsuchen klappt nicht (kann das sein das das gespert ist?/werden kann?)

ich hab mit der dll auch ein paar funktionsvorschlage bekommen (also in der textbeschreibung dafür)
usbdmx.txt schrieb:
usbdmx.dll - Schnittstelle:


-----------
Funktionen:
-----------

GetAllConnectedInterfaces: TSERIALLIST;
GetAllOpenedInterfaces: TSERIALLIST;
SetInterfaceMode(Serial: TSERIAL; Mode: byte): DWORD;
OpenLink(Serial: TSERIAL; DMXOutArray: PDMXArray; DMXInArray: PDMXArray): DWORD;
CloseLink(Serial: TSERIAL): DWORD;
CloseAllLinks: DWORD;
RegisterInterfaceChangeNotification(Proc: THOSTDEVICECHANGEPROC): DWORD;
UnregisterInterfaceChangeNotification: DWORD;
RegisterInputChangeNotification(Proc: THOSTINPUTCHANGEPROC): DWORD;
UnregisterInputChangeNotification: DWORD;
GetDeviceVersion(Serial: TSERIAL): DWORD;
SetInterfaceAdvTxConfig(Serial: TSERIAL; Control: Byte; Breaktime: word; Marktime: word; Interbytetime: word; Interframetime: word; Channelcount: word; Startbyte: byte): DWORD; stdcall; // >= v1.1
StoreInterfaceAdvTxConfig(Serial: TSERIAL): DWORD; stdcall; // >= v1.1
RegisterInputChangeBlockNotification(Proc: THOSTINPUTCHANGEPROCBLOCK): DWORD; // >= v1.1
UnregisterInputChangeBlockNotification: DWORD; // >= v1.1


-------------------------------------
Object-Pascal Deklarationsvorschläge:
-------------------------------------

function GetAllConnectedInterfaces: TSERIALLIST; stdcall external 'usbdmx.dll';
function GetAllOpenedInterfaces: TSERIALLIST; stdcall external 'usbdmx.dll';
function SetInterfaceMode(Serial: TSERIAL; Mode: byte): DWORD; stdcall external 'usbdmx.dll';
function OpenLink(Serial: TSERIAL; DMXOutArray: PDMXArray; DMXInArray: PDMXArray): DWORD; stdcall external 'usbdmx.dll';
function CloseLink(Serial: TSERIAL): DWORD; stdcall external 'usbdmx.dll';
function CloseAllLinks: DWORD; stdcall external 'usbdmx.dll';
function RegisterInterfaceChangeNotification(Proc: THOSTDEVICECHANGEPROC): DWORD; stdcall external 'usbdmx.dll';
function UnregisterInterfaceChangeNotification: DWORD; stdcall external 'usbdmx.dll';
function RegisterInputChangeNotification(Proc: THOSTDEVICECHANGEPROC): DWORD; stdcall external 'usbdmx.dll';
function UnregisterInputChangeNotification: DWORD; stdcall external 'usbdmx.dll';
function GetDeviceVersion(Serial: TSERIAL): DWORD; stdcall external 'usbdmx.dll';
function SetInterfaceAdvTxConfig(Serial: TSERIAL; Control: Byte; Breaktime: word; Marktime: word; Interbytetime: word; Interframetime: word; Channelcount: word; Startbyte: byte): DWORD; stdcall; stdcall external 'usbdmx.dll';
function StoreInterfaceAdvTxConfig(Serial: TSERIAL): DWORD; stdcall; stdcall external 'usbdmx.dll';
function RegisterInputChangeBlockNotification(Proc: THOSTINPUTCHANGEPROCBLOCK): DWORD; stdcall external 'usbdmx.dll';
function UnregisterInputChangeBlockNotification: DWORD; stdcall external 'usbdmx.dll';


------
Werte:
------
Mode: 0 - Standby; 1 - DMX In -> DMX Out; 2 - PC Out -> DMX Out; 3 - DMX In + PC Out -> DMX Out; 4 - DMX In -> PC In; 5 - DMX In -> DMX Out & DMX In -> PC In; 6 - PC Out -> DMX Out & DMX In -> PC In; 7 - DMX In + PC Out -> DMX Out & DMX In -> PC In;
Version: 0x0100 = v1.00, 0x0110 = v1.10 usw.
ConfigControl: Bit 0: Enable Interbytedelay, Bit 1: Enable Interframedelay, Default = 0
Breaktime: Zeit des Resetpulses, 5,333us Schrittweite, Default = 17
Marktime: Zeit zwischen Resetpuls und Startbyte, 0.666us Schrittweite, Default = 13
Interbytetime: Zeit zwischen zwei Datenbytes (8N2), 0.666us Schrittweite, Default = 0
Interframetime: Zeit zwischen dem letzten Datenbyte und dem Resetpuls, 21,333us Schrittweite, Default = 0
Channelcount: Default = 512
Startbyte: Default = 0


------------------------------
Object-Pascal Typenvorschläge:
------------------------------

PDMXArray = ^TDMXArray;
TDMXArray = array[0..511] of byte;
TSERIAL = array[0..15] of Char;
TSERIALLIST = array[0..31] of TSERIAL;
THOSTDEVICECHANGEPROC = procedure; stdcall;
THOSTINPUTCHANGEPROC = procedure; stdcall;
THOSTINPUTCHANGEPROCBLOCK = procedure(blocknumber: byte); stdcall; // >= v1.1


------------------------
Hilfsroutinenvorschläge:
------------------------

function SerialToSerialstring(Serial: TSERIAL): string;
var i: byte;
begin
Result := '';
for i := 0 to 15 do Result := Result + Serial;
end;

function SerialstringToSerial(Serialstr: string): TSERIAL;
var i: byte;
len: byte;
begin
len := length(Serialstr);
if len > 16 then len := 16;
for i := 0 to 15 do Result := '0';
for i := 1 to len do Result[i + 15 - len] := Serialstr;
end;
 
Mir scheint, das einbinden ins Projekt war nicht nötig. Hab mir die DLL mal runtergeladen und rumprobiert, folgendes kam raus:

Code:
public partial class Form1 : Form
{
    [DllImport("usbdmx.dll")]
    public static extern void GetAllConnectedInterfaces(char[] result);

    public Form1()
    {
        InitializeComponent();
        Test();            
    }

    private void Test()
    {
        char[] c = new char[32];
        GetAllConnectedInterfaces(c);
    }
}

Das kompiliert und läuft durch, ohne zu crashen. Viel mehr kann ich aber nicht sagen, hab keine Platine zum anschliessen und sehen, ob das Ergebnis Sinn macht^^
Problem ist folgendes: Das mitgelieferte Beispiel ist C++, und davon hab ich wenig Ahnung. Die GetAllConnectedInterfaces-Funktion will eigentlich nen Pointer, sowas gibts aber in C# nicht - ich habs mal mit ref und out versucht, da hauts mir aber das Programm um die Ohren (nichtmal try-catch fängt das ab^^). Deswegen weiß ich nicht, ob das so überhaupt was zurückliefern kann. Zweites Problem: ob das jetzt wirklich ein char[32] ist, wage ich zu bezweifeln. Im Beispiel steht das hier drin:

Code:
typedef char TSERIAL[16];
typedef TSERIAL TSERIALLIST[32];

typedef void (STDCALL* TGetAllConnectedInterfaces) (TSERIALLIST* SerialList);
TGetAllConnectedInterfaces GetAllConnectedInterfaces;

Kann vielleicht einer entsprechend anpassen, der Ahnung von C++ hat ;)
 
Ich dachte, du redest von einer Managed Code DLL?

Wenn du eine Win32 DLL hast, musst du völlig anders vorgehen. Habe ich aber selbst noch nicht gemacht. Sieh dich mal in den Google Groups um.
 
DJ_of_Borg am 30.04.2007 22:24 schrieb:
Mir scheint, das einbinden ins Projekt war nicht nötig. Hab mir die DLL mal runtergeladen und rumprobiert, folgendes kam raus:

Code:
public partial class Form1 : Form
{
    [DllImport("usbdmx.dll")]
    public static extern void GetAllConnectedInterfaces(char[] result);

    public Form1()
    {
        InitializeComponent();
        Test();            
    }

    private void Test()
    {
        char[] c = new char[32];
        GetAllConnectedInterfaces(c);
    }
}

Das kompiliert und läuft durch, ohne zu crashen. Viel mehr kann ich aber nicht sagen, hab keine Platine zum anschliessen und sehen, ob das Ergebnis Sinn macht^^
Problem ist folgendes: Das mitgelieferte Beispiel ist C++, und davon hab ich wenig Ahnung. Die GetAllConnectedInterfaces-Funktion will eigentlich nen Pointer, sowas gibts aber in C# nicht - ich habs mal mit ref und out versucht, da hauts mir aber das Programm um die Ohren (nichtmal try-catch fängt das ab^^). Deswegen weiß ich nicht, ob das so überhaupt was zurückliefern kann. Zweites Problem: ob das jetzt wirklich ein char[32] ist, wage ich zu bezweifeln. Im Beispiel steht das hier drin:

Code:
typedef char TSERIAL[16];
typedef TSERIAL TSERIALLIST[32];

typedef void (STDCALL* TGetAllConnectedInterfaces) (TSERIALLIST* SerialList);
TGetAllConnectedInterfaces GetAllConnectedInterfaces;

Kann vielleicht einer entsprechend anpassen, der Ahnung von C++ hat ;)

hmm da ich c# anfanger bin kann ich es nicht genauer beschreiben, ich hab deinen code obend kopiert
und unter verweis das bin verzeichnis angegeben wo die usbdmx.dll ist
aber der compiler sagt mir

Fehler 2 Der Typ- oder Namespacename "DllImport" konnte nicht gefunden werden. (Fehlt eine using-Direktive oder ein Assemblyverweis?) g:\dmx program\c sharp\pro1\WindowsApplication2\WindowsApplication2\Form1.cs 13 10 WindowsApplication2

hmm wie hast du sie ins program eingebunden?

naja ich lerne das ganze grade darum dauert es seinen zeit bis ich mich mit den einzelnen problemen befasse

wegen den pointer
es ist ein "lowcost" dmx/usb/dmx interface
ähm dmx ist ein daten-protocol in der lichttechnik (für die die es nicht wissen)
als solchen kann es nur 512dmx kanäle ansprechen (oder anders ausgedrückt eine dmx leitung versorgen) bei grossen lichtanlagen reicht das aber machmal nicht aus darum gibt es die möglichkeit mehrer interface-geräte anzuschliessen und paralell zu betreiben, ich denke das steckt dahinter
 
BLACKDIMMU am 02.05.2007 22:08 schrieb:
hmm da ich c# anfanger bin kann ich es nicht genauer beschreiben, ich hab deinen code obend kopiert
und unter verweis das bin verzeichnis angegeben wo die usbdmx.dll ist
aber der compiler sagt mir

Fehler 2 Der Typ- oder Namespacename "DllImport" konnte nicht gefunden werden. (Fehlt eine using-Direktive oder ein Assemblyverweis?) g:\dmx program\c sharp\pro1\WindowsApplication2\WindowsApplication2\Form1.cs 13 10 WindowsApplication2
Geh mal mit dem Cursor irgendwo in das DllImport (im Code), dann erscheint unten Rechts am Wort ein roter Strich. Da mit der Maus drüber und die obere der beiden Optionen wählen.

Alternativ (bzw. manuell) bei den usings

using System.Runtime.InteropServices;

einfügen.
 
BLACKDIMMU am 02.05.2007 22:08 schrieb:
wegen den pointer
es ist ein "lowcost" dmx/usb/dmx interface
ähm dmx ist ein daten-protocol in der lichttechnik (für die die es nicht wissen)
als solchen kann es nur 512dmx kanäle ansprechen (oder anders ausgedrückt eine dmx leitung versorgen) bei grossen lichtanlagen reicht das aber machmal nicht aus darum gibt es die möglichkeit mehrer interface-geräte anzuschliessen und paralell zu betreiben, ich denke das steckt dahinter
Nee, das hat mit Pointer nix zu tun. Ein Pointer ist quasi ein "Zeiger" auf einen Speicherberich. In C++ (und anderen Sprachen) kann man damit locker wild im Speicher rumschreiben (und lesen), was einerseits vieles Ermöglicht, andererseits aber auch viel Vorsicht erfordert, weil man da eben genauso locker in Bereiche schreiben kann, in denen noch was anderes wichtiges steht^^
In C# gibts das jedenfalls nicht, das bei der DLL mitgelieferte Beispiel nutzt das aber (und die dll intern wahrscheinlich auch), so daß man das in einem C#-Programm eben anpassen muss. Gehen tut das, ich kann blos so ohne weiteres nicht sagen wie, und zum ausprobieren bräucht ich halt so ne Platine.
 
DJ_of_Borg am 30.04.2007 22:24 schrieb:
Mir scheint, das einbinden ins Projekt war nicht nötig. Hab mir die DLL mal runtergeladen und rumprobiert, folgendes kam raus:

Code:
public partial class Form1 : Form
{
    [DllImport("usbdmx.dll")]
    public static extern void GetAllConnectedInterfaces(char[] result);

    public Form1()
    {
        InitializeComponent();
        Test();            
    }

    private void Test()
    {
        char[] c = new char[32];
        GetAllConnectedInterfaces(c);
    }
}


[/qoute]

sooo ich konnte das entlich auch mal feherfrei durch kompelieren, und ich wollte das ergebnis mit einem label ausgeben (konvertierung des array's hat nach ein bissel rumprobieren auch keine fehlermeldung gebracht)

aber es wird kein wert aus gegeben.
und ich hab es mir noch mal genau angeschaut
und da viel mir persönlich eine logik frage ein, woher weis der kompiler das er das GetAllConnectedInterfaces in der dll suchen muß?

hmm
 
BLACKDIMMU am 22.07.2007 21:38 schrieb:
und da viel mir persönlich eine logik frage ein, woher weis der kompiler das er das GetAllConnectedInterfaces in der dll suchen muß?
Das weiß er wegen
Code:
    [DllImport("usbdmx.dll")]
    public static extern void GetAllConnectedInterfaces(char[] result);

Warum da aber jetzt nix rauskommt, keine Ahnung, aber das werd ich ohne ein "connected interface" wohl auch nicht ausprobieren können :o
 
nur mal frage OT: wie spricht man das eigentlich aus? "Zeh Raute"...? "Si Nammba"...? als programmier-laie kannte ich bisher nur C++


:]
 
DJ_of_Borg am 22.07.2007 23:23 schrieb:
Herbboy am 22.07.2007 23:12 schrieb:
nur mal frage OT: wie spricht man das eigentlich aus? "Zeh Raute"...? "Si Nammba"...? als programmier-laie kannte ich bisher nur C++
:]
Si Sharp ;)
ach, das # heißt echt sharp? hab ich auch noch nie gehört.

thx
 
Zurück