Blitzbasic 2d DLL

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

noir

Betreff: Blitzbasic 2d DLL

BeitragMo, Jan 03, 2005 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Da man mit bb2d keine userlibs benutzen kann, wollte ich fragen ob mal jemand mit einem kurzen beispiel erklären kann wie man eine dll mit c++ für blitzbasic schreibt?

die OH schreibt nur das als "denkanstoß" dazu:

extern "C"{
_declspec(dllexport) int _cdecl my_dll_func( const void *in,int in_size,void *out,int out_size );
}

also blitzbasic empfängt nur den Pointer eines Speicherfeldes und die Länge in Byte. und die rückgabewerte muss ich in einer speicherbank speichern.


für eine dll bei c++ sieht der header z.b so aus: (glaub ich)

#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else
# define DLLIMPORT __declspec (dllimport)
#endif

class DLLIMPORT DllClass
{
public:
DllClass();
virtual ~DllClass(void);

private:

};

dann muss ich eine funktion schreiben in der ich die größe der zu empfangenden werte oder zu sendenden werte in bytes schreib und die pointer für die zu übergebendne werte.


...

ich bekomme es jedenfalls nicht hin Crying or Very sad

kann vielleicht irgendjemand von euch ein beispiel schreiben:
ich hab zwar schon etwas ahnung von c++ aber wie man eine dll zu programmieren hat, weiß ich leider nicht

es reicht wenn eine einzige variable übergeben wird. (von der dll nach bb).
danke.

den rest check ich vielleicht dann wieder...
  • Zuletzt bearbeitet von noir am Mo, Jan 10, 2005 17:13, insgesamt einmal bearbeitet
 

Dreamora

BeitragMo, Jan 03, 2005 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
was hast du bis jetzt, dann kann man dir sagen was falsch ist.

Das mit der Class nutzt dir nichts. Du musst "normale" Funktionen exportieren, mit klassen kann BB nix anfangen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

noir

BeitragMo, Jan 03, 2005 23:14
Antworten mit Zitat
Benutzer-Profile anzeigen
von dlls hab ich keine ahnung, das mit dem header generiert dev-c++ wenn ich ne dll erstellen will. dachte man braucht das.


funktion:

Int i=3;
Int *p = &i;

bb_funkt(*p, 4)

Int bb_funkt ( Int *out, Int out_size)
{
Return *out;
}


wie würde das hinhauen?
ich will die int i variable übergeben??
 

Dreamora

BeitragMo, Jan 03, 2005 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo der Header ist richtig, der stimmt schon.

Das Problem ist du versucht eine Klasse zu exportieren und das bringt garnix.
Der Return bringt als solches bedingt etwas. Ich weiss nicht ob er ausgewertet wird, aber er muss auf jeden fall etwas zurück geben sonst wird die funktion von Blitz nicht erkannt ( also void ... geht net )

Du müsstest


int DLLIMPORT bb_funkt( char *in, int in_size, char *out, int out_size )
{
int i = 3;
return i;
}


oder falls der Return nicht ausgewertet wird:

BOOL DLLIMPORT bb_funkt( char * in, int in_size, char *out, int out_size )
{
out = 3;
return true;
}

*der code müsste glaub so stimmen ... habe schon ne weile keine Plugins mehr geschrieben für Gile[s] und/oder Cartography Shop und dort habe ich das das letzte Mal benötigt*
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

noir

BeitragMo, Jan 03, 2005 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
hätte da noch einige fragen, brauche ich in einer dll keine main funktion?

das hab ich bis jetzt:
also funktionieren tut es nicht..

Code: [AUSKLAPPEN]

#include "dll.h"

int i=3;
int *p = &i;

int bb_funkt(int *out, int out_size)
{
return *out;
}
 
bb_funkt(*p, 4)


header(dll.h):

Code: [AUSKLAPPEN]

#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else
# define DLLIMPORT __declspec (dllimport)
#endif

#endif

  • Zuletzt bearbeitet von noir am Di, Jan 04, 2005 11:56, insgesamt einmal bearbeitet
 

Dreamora

BeitragDi, Jan 04, 2005 1:00
Antworten mit Zitat
Benutzer-Profile anzeigen
du hast keinerlei ahnung von C ...
ich empfehle dir von daher erst einmal C ein wenig zu erlernen bevor du damit DLLs für BB schreiben willst

In der H file ist keine implementation sondern nur die deklaration!
wenn du allerdings nur 1 datei hast braucht es das eigentlich nicht, das ist für übergreifende deklarationen. musst nur die DLLIMPORT definition in die C / cpp rüber nehmen

und die Form der Funktionsdeklaration ist fix!
Du musst IMMER ( type *inbuff, int in_size, type *outbuff, int out_size ) haben, sonst gehts prinzipiell nicht
*für type kannst du irgendwas verwenden, empfehlenswert ist char, da das beliebig grosse buffer erlaubt*

ob das mit dem return der zahl geht weiss ich nicht, das müsstest du rausfinden.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

noir

BeitragDi, Jan 04, 2005 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab keine ahnung von dlls, von c++ schon etwas.

mit dem header hast du natürlich recht, ich hatte dein post davor irgendwie falsch verstanden. ich dachte du meinst ich sollte diese funktion in den header mit rein schreiben...

mir würde es reichen wenn mir einer nur den aufbau erklären würde was in eine dll rein muss. das versteh ich nicht.


ok das ist der aufbau einer win 32 dll:
die dllmain funktion muss jede dll besitzen:
jetzt weiß ich nur nicht wie ich die für bb benötigte form einer funktion einbaue. ich verstehe zum beispiel nicht warum ich die größe in byte mit übergeben soll. oder fragt dies bb alleine ab?? denn zum aufrufen der dll muss ich dies ja nicht wissen.

Code: [AUSKLAPPEN]


#include "stdafx.h" //vorkompilierten Header-Datei


BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                )
{
    return TRUE;
}

 

trooper

BeitragDi, Jan 04, 2005 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
die dllmain funktion muss jede dll besitzen


nein, die brauchts nicht ...

versuch mal in der header datei:

DLLIMPORT extern int bb_func(...)

und in der quellcode datei
#include "Header.h"
int bb_func(...)
{
return 2;
}
-- imtane.de.vu --
a cherring ping
 

noir

BeitragDi, Jan 04, 2005 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
danke dreamora und trooper

@trooper an der headerdatei hat es nicht gelegen, "stdafx.h" als header datei reicht aus!


ich schreib in kürze mal wie es funktioniert hat, hab im moment keine zeit.


Code: [AUSKLAPPEN]

//stdafx.h:

#if !defined(AFX_STDAFX_H__44AD34F2_2C8D_44EB_8071_8F8B717DA9C8__INCLUDED_)
#define AFX_STDAFX_H__44AD34F2_2C8D_44EB_8071_8F8B717DA9C8__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define WIN32_LEAN_AND_MEA
#include <windows.h>

#endif // !defined

TheShadow

Moderator

BeitragDi, Jan 04, 2005 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
http://www.blitzbase.de/downloads/blend.zip

hier eine DLL als Beispiel... Nur dort sind Funktionen für BB3D/Plus und BB2D enthalten... musst selbst austüfteln welche das sind...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
 

noir

BeitragDi, Jan 04, 2005 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
danke, werde es mir mal anschauen.
 

noir

BeitragMi, Jan 05, 2005 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
hab noch ne andere frage:

also die dll funktioniert und ich nutze sie um die zwischenablage abzufragen.

aber ich kann ja keine strings übergeben und bb2d kennt ja auch keine pointer.
und ich kann immer nur einen wert mit return zurückgeben.
d.h. ich müsste zeichen für zeichen übergeben und jedesmal die dll neu aufrufen.

gibts noch ne andere möglichkeit ein chararray/string zu übergeben?

versteh ihr mein problem?
 

Dreamora

BeitragMi, Jan 05, 2005 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
ja indem du eine bank schickst ... dafür sind die inbuffer / outbuffer ja da Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Vertex

BeitragMi, Jan 05, 2005 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
.lib "MyDLL.dll"
MyFunction%(Stringparameter$)


Blitz wandelt den String automatisch in einem C-Nullterminated-String um.

Weiterhin kannst du mit Pointern arbeiten, in dem Du als Suffix ein * angibst. In Blitz kannst du somit Types und Banks an die DLL übergeben.

Edit: Ja sorry, ist ja keine userlib.

Also machs so:
Erstelle eine Bank, poke Byte für Byte den String in die Bank, und poke dann am Ende noch den Wert 0 rein.
vertex.dreamfall.at | GitHub
  • Zuletzt bearbeitet von Vertex am Mi, Jan 05, 2005 19:40, insgesamt einmal bearbeitet

TheShadow

Moderator

BeitragMi, Jan 05, 2005 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
hm in bb3d/plus gng das glaube ich... hier musst du wohl string in bank umwandeln...



Vertex er hat BB2D!
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
 

noir

BeitragMi, Jan 05, 2005 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
ich speichere den string jetzt in einer textdatei und lass in mit bb auslesen, das ist halt nicht so elegant.

aber mein problem ist eher, ich kann pro dll aufruf nur einen wert übergeben, mit return irgendwas; halt.

wie übergebe ich mehrere, oder steh ich grad auf irgendeinem schlauch?

Vertex

BeitragMi, Jan 05, 2005 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Function PokeString(Bank, Txt$)
   Local I
   ResizeBank Bank, Len(Txt$)+1

   For I = 0 To Len(Txt$)
      PokeByte Bank, I, Asc(Mid$(Txt$, I+1, 1))
   Next
   PokeByte Bank, Len(Txt$)+1, 0
End Function


Und dann einfach die Bank übergeben
vertex.dreamfall.at | GitHub
 

noir

BeitragMi, Jan 05, 2005 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
danke, das ist schon klar.
aber mein problem ist immer noch:

Code: [AUSKLAPPEN]

_declspec(dllexport) _cdecl my_dll_func( const void *in,int in_size,void *out,int out_sz )
{

char szText[100];

    if(GetStringFromClipboard(szText))
   {
return (char)szText[0]; //hier würde ich das erste zeichen übergeben
   }


return 0;
 

}


ich kann immer nur einen wert übergeben(oder hier ein char)
 

Dreamora

BeitragMi, Jan 05, 2005 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
was glaubst du wozu der outbuffer genau ist?

da rein kannst du alle daten packen die du willst und in Blitzbasic nimmst du den als bank entgegen und liest die daten wieder aus der bank aus. bisschen mitdenken nachdem ichs nu gut 4x geschrieben habe
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group