Seite 1 von 2

Schaffe es nicht meine C-DLL in Purebasic aufzurufen

Verfasst: 01.10.2005 14:21
von 24dan
Hallo...,
habe mir eine Test - dll mit dem bcc zusammen gebaut:

Code: Alles auswählen


/* add.c for dll with command #BCC -WD add.c */

#include <stdio.h>

int maxi(void)
{
    printf("Hallo World\n");   
    return(1);
}
und wollte diese in Purebasic laden (geht auch)

Code: Alles auswählen

OpenConsole()
Input()
a.l = 100
If(0 = OpenLibrary(1, "add.dll"))
  Print("dll not found!")
Else
  a = OpenLibrary(1, "add.dll")
  Print(Str(a)+" ")
  If (0 = IsFunction(1, "maxi"))
    Print("function not found!")
  Else 
    a = CallCFunction(1, "maxi")
    Print(Str(a))
  EndIf
EndIf
CloseLibrary(1)

Input()
CloseConsole()
und dann die Funktion ausführen (geht nicht). :|

Verfasst: 01.10.2005 14:53
von ts-soft
Die DLL kann nicht in die von PB erzeugte Console schreiben. Du müßtest die Console auch in der DLL erzeugen oder die API statt der PB Console verwenden.

PS: Die Klammersetzung ist ja :freak: :wink:

Verfasst: 01.10.2005 15:04
von 24dan
1. Wie rufe ich den eine Console in c auf?
2. oder wie nutzte ich die API dazu?


ts-soft hat geschrieben: PS: Die Klammersetzung ist ja :freak: :wink:
Welcher Kl(J)ammern meinst DU :roll:

Verfasst: 01.10.2005 15:21
von ts-soft
>> Welcher Kl(J)ammern meinst DU

Code: Alles auswählen

If (0 = IsFunction(1, "maxi"))
funzt das überhaupt ???

Der beste Weg ist, den String als Rückgabewert der DLL zu definieren und diesen einfach in PB in eine Console Printen.

Alles andere wäre IMHO sehr Aufwendig und macht keinen Sinn

Verfasst: 01.10.2005 15:27
von 24dan
Ergebnis.l = IsFunction(#Library, FunktionsName$)
ja das müsste eigentlich gehen


und die übergabe von strings aus einer c lib ist nach meinem Kenntnisstand nur durch die Übergabe einer Adresse eines Arrays möglich.
Werde mich gleich an die Änderung setzten und mal schauen ob es klappt.
Danke
<)

Verfasst: 01.10.2005 16:30
von 24dan
So mal ganz einfach:

C Prog add.c -> add.dll

Code: Alles auswählen

#include <stdio.h>

int addvalue()
{
    return(7);
}

Basic Prog

Code: Alles auswählen

  OpenConsole()
    Input()
    a.l 
    If(0 <> OpenLibrary(1, "add.dll"))
      a = CallCFunction(1, "addvalue")
      Print(Str(a))
    EndIf
  CloseLibrary(1)
  Input()
  CloseConsole()
but it does not work
:allright:

Verfasst: 01.10.2005 16:48
von Deeem2031
Es gab mal Probleme wenn man eine Konstante mit einer Proc vergleicht und die Konstante zuerst schreibt, also so wie "If(0 <> OpenLibrary(1, "add.dll"))" sollte eigentlich schon behoben sein, aber vielleicht probierste es einfach mal mit "If OpenLibrary(1, "add.dll")"

Verfasst: 01.10.2005 17:07
von Kaeru Gaman
ts-soft hat geschrieben:

Code: Alles auswählen

If (0 = IsFunction(1, "maxi"))
funzt das überhaupt ???
24dan hat geschrieben:Ergebnis.l = IsFunction(#Library, FunktionsName$)
ja das müsste eigentlich gehen
es geht hier nicht um ergebnis = Proc(), sondern um die klammerung..

ein ausdruck in klammern ist ein boole'scher ausdruck,
diese werden von PB leider, leider, leider nicht korrekt unterstützt.

demo:

Code: Alles auswählen

a=2
For n =0 To 5
    Debug (n>a)
Next
der output sollte lauten:
0
0
0
1
1
1
er lautet aber:
2
2
2
2
2
2
also, vergleichsoperatoren in klammern in PB nicht verwenden.
(solange, bis es endlich implementiert wird)

Verfasst: 01.10.2005 17:16
von 24dan
@Kaeru Gaman

okay...
aber Zuweisungen funktionieren doch eigentlich oder?

Code: Alles auswählen

a = CallCFunction(1, "addvalue")
@Deeem2031

If (... ist jetzt angepasst. Es funktioniert jedoch immer noch nicht.

Kann es sein das ich mit dem Borland Compiler keine für PB verarbeitbare dll bauen kann?

Verfasst: 01.10.2005 17:19
von Kaeru Gaman
klar, die zuweisungen funktionieren...

nur boole'sche ausdrücke leider nicht... ich vermisse sie schrecklich...