DLL hin und DLL her

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Silver_Knee

Betreff: DLL hin und DLL her

BeitragMo, Jan 07, 2008 13:08
Antworten mit Zitat
Benutzer-Profile anzeigen
also: Ich hatte vor 1001 Jahren hier schon mal diese Frage gepostet nur hatte ich da noc 0 Ahnung und hab nur macht mal alle geschrieben ... ich glaube das ding ist irgendwo im Trash verschwunden. Es geht um diese webcam.dll die ich von nem freund der mit GameMaker arbeitet vorgeschlagen bekommen hab. nun hab ich sie wieder gefunden. mit beispiel code.

Dieser besteht aus vielen unerkennlichen zeichen ud zwischendrinne ist das:
Code: [AUSKLAPPEN]

global.cCam_ = external_define('webcam.DLL','createCam',dll_stdcall,ty_string,5,ty_real,ty_real,ty_real,ty_real,ty_real);
global.connect_ = external_define('webcam.DLL','connect',dll_stdcall,ty_string,1,ty_real);
global.disconnect_ = external_define('webcam.DLL','disconnect',dll_stdcall,ty_string,0);
global.saveToDIB_ = external_define('webcam.DLL','saveToDIB',dll_stdcall,ty_string,1,ty_string);


Ich hab das immerhin so verstanden. Parameter
1) der dll name
2) Function in der dll
3) die dll wurde mit std_call gemacht
4) ein string....naja ein string halt
5) anzahl der Parameter der dll-funktion.
6,7,8,9,10)dll parameter

so weiter unten im code steht folgendes
Code: [AUSKLAPPEN]
}        createCam?  x   //createCam(x,y,width,height)
{
external_call(global.cCam,window_handle(),argument0,argument1,argument2,argument3);
}      connect?  @   //connect(FPS);
{
external_call(global.connect_,argument0);
}         saveToDIB?  1   {
external_call(global.saveToDIB_,argument0);
}   
   disconnect?  (   {
external_call(global.disconnect_);
}


aus dem ganzen gewurschtel erkennt man meiner meinung nach
- CreateCam hat 5 parameter. Der erste ist immer die Window_handle die argumente 0-3 (zeile oben drüber) sind x,y,width und height.
-connect hat einen parameter und zwar fps
-saveToDIB hat einen Parameter (weiter unten im code wird klar das dies der Daeiname ist Code: [AUSKLAPPEN]
saveToDIB("test.bmp")
)
-disconnect hat keine Parameter.

Ich bin also hergegangen und hab versucht ne decls zu schreiben.
webcam.decls hat Folgendes geschrieben:
.lib "webcam.dll"
CreateCam%(window_handle%,x%,y%,w%,h%):"createCam"
ConnectCam%(fps%):"connect"
DisconnectCam%():"disconnect"
SaveDib%(bmpfile$):"saveToDIB"

und ein kleines Testprogramm wollte ich auch gleich schreiben.
Code: [AUSKLAPPEN]
CreateCam(SystemProperty("AppHWND"),0,0,250,250)
ConnectCam(30)
;SaveDib("cool.bmp")
;image=LoadImage("cool.bmp")
;DrawImage image,0,0
WaitKey
DisconnectCam()


bei mir kommt 0 und wenn ich den DIB savecode reintue eine Unknown Runtime Exeption.
Das testprogramm gibt es nochmal 1:1 in dem GameMaker-Code: [AUSKLAPPEN]
createCam(0,0,250,250); //createCam(x,y,width,height)
connect(30); //connect(FPS)
}   0   0   0   0   0   0   0    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ    ?     ¸     [                                                                ÿÿÿÿ       N   {
saveToDIB("test.bmp");
sprite_replace(sprite1,"test.bmp",0,0,0,0,0,0,0)
}   0   0   0   0   0   0   0    ÿÿÿÿÿÿÿÿ   ?     ¸     [                                                                ÿÿÿÿ          {
disconnect();
}


Nur sind hier viele ÿ und bei createCam fehlt der window_handle-Parameter., was wohl daran liegt das er in meinem ersten codeabschnitt als Standard mit window_handle() belegt wurde

Nun infos zur DLL:
in dem tutorial der Seite von der DLL(Di Da) findet sich ein Tutoral um C++-DLLs für GameMaker zu schreiben (Das Da). Ich habe mich mal hingesetzt und da rein gekukt und diese zeile kommt mir bekannt vor:
Zitat:
Exporting Functions

You define exported functions using this code:

Code: [AUSKLAPPEN]
extern "C" __declspec(dllexport) __stdcall [function and args here];


ebenso wie das ding da:
Code: [AUSKLAPPEN]
 BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,

                       DWORD reason /* Reason this function is being called.*/,

                       LPVOID reserved /* Not used. */ )


und ja ich weiß woher ich sie kenne. Ich rase also in unseren Tut bereich und finde diese sachen da:
Code: [AUSKLAPPEN]
extern "C" _declspec(dllexport) char* _stdcall gibnenstringzurueck() {
  static char* s = "Dies ist ein String.";
  return s;
}
aus diesem Post

und Code: [AUSKLAPPEN]

BOOL WINAPI DllMain( HANDLE hInstDLL, DWORD dwReason, LPVOID lpvReserved );
aus zB diesem Thread hier

Da die C++-Codes laut meiner Recherche über einstimmen und die ihre dlls wahrscheinlich auch nach ihren Tutorials machen sollten die GameMaker dlls auch mit BB kompatibel sein. Ich muss also irgendetwas übersehen haben. Wahrscheinlich etwas was mir als C++ Leihe nicht auffällt. Ich bitte nun um eure Hilfe. Ich habe meiner Meinung nach alle Infos gebracht die man durch Recherche auf dieser Seite und auf deren Seite hervorbringen kann. Ihr habt alle links. Der von der webcam.dll findet sich einmal auf der Seite und ich poste ihn jetzt nochmal hier: http://mdgames.atspace.com/webcam.zip
 

Dreamora

BeitragMo, Jan 07, 2008 14:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau ma in die DLL direkt rein mit nem texteditor wie die funktionen heissen oder genauer: ob ihr name zb von createCam zb noch ein @20 dahinter hat.

wenn ja musst du bei deinem mappings überall das auch noch anfügen.
Das @XX ist dabei die Bytezahl die der funktion rein übergeben wird.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

ChristianK

BeitragMo, Jan 07, 2008 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
PEview kann ich nur empfehlen. Damit kannst du dir EXE-Dateien, DLLs und was es halt so gibt, anschauen.
http://www.magma.ca/~wjr/PEview.zip

Weil da "__declspec( dllexport )" und "_stdcall" verwendet werden, wird es wohl so aussehen:
Code: [AUSKLAPPEN]
MeineFunktion%( param% ) : "_MeineFunktion@4"

Also mit dem Unterstrich und der Anzahl Bytes hinter dem @.

Edit: Nein, doch nicht. So wie du's oben geschrieben hast, ist es richtig. Anonsten wäre auch "Userlib function not found" gekommen.

Edit2: Ich hätte da noch eine Vermutung. Der Gamemaker akzeptiert ( laut der Website dieses Typen ) nur 64-Bit Werte. An der Stelle, an der du z.B. "connect" aufrufst, übergibt Blitz einen 32-Bit Wert, wo von der DLL 64-Bit erwartet werden. Vielleicht kommt deshalb der Fehler ...
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Silver_Knee

BeitragMo, Jan 07, 2008 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wäre mal ein Ansatz. 64 Bits (=8 Bytes wenn ich nicht irre) könnte ich soweit ich weiß über eine Bank an die dll bringen. Stimmt das?
wenn ja müsste meine decls dann so aussehen:
Zitat:
.lib "webcam.dll"
CreateCam%(window_handle*,x*,y*,w*,h*):"createCam"
ConnectCam%(fps*):"connect"
DisconnectCam%():"disconnect"
SaveDib%(bmpfile$):"saveToDIB"

und ein Code wäre zB Code: [AUSKLAPPEN]
bank0=CreateBank(8)
bank1=CreateBank(8)
bank2=CreateBank(8)
bank3=CreateBank(8)
bask4=CreateBank(8)

PokeInt bank0,4,SystemProperty("AppHWND")
PokeInt bank1,4,0
PokeInt bank2,4,0
PokeInt bank3,4,250
PokeInt bank4,4,250

CreateCam(bank0,bank1,bank2,bank3,bank4)

Oder?

EDIT Ach ja Funktionsnamen:
user posted image
  • Zuletzt bearbeitet von Silver_Knee am Mo, Jan 07, 2008 18:47, insgesamt einmal bearbeitet
 

ChristianK

BeitragMo, Jan 07, 2008 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Muss es nicht PokeInt sein, bei einem Offset von 4 Bytes?
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Silver_Knee

BeitragMo, Jan 07, 2008 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
ach himmel mein ich doch Wink Ich wollte nur noch mal wissen wäre das der richtige weg^^*obigen post nacheditier*


*EDIT*

HACH ich hab gewusst Real hab ich schon mal irgendwo gelesen!
http://www.silizium-net.de/bbfaq4.htm
DA Drinnen kommt die Fehlermeldung:
Zitat:
Index variable must be integer or real
Indexvariable muss entweder Integer oder Float sein


Kann es sein dass die Funktion Floats übergeben bekommen möchte??
 

ChristianK

BeitragMo, Jan 07, 2008 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab grad mal nachgeschaut. Der Gamemaker unterstützt nur Strings und Kommazahlen. Hat mich auch gewundert, warum man da Real verwendet. Aber einen Versuch ist's Wert.
Leider hab ich zur Zeit keine Webcam da, sonst könnt ich versuchen eine blitz-freundlichere DLL zu schreiben. Mit Banks ist's ja irgendwie umständlich. Smile
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Silver_Knee

BeitragMo, Jan 07, 2008 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
also 64-Bit-Floats... des kann ich vergessen oder^^ nunja ich probiere mal


*EDIT*

Ok probiert-.-

Kann man ne DLL schreiben die aus 32bit-BB-Floats 64bit-Floats in form einer BB-Bank zurückgibt sodass ich der Webcam-Funktion diese als parameter übergeben kann^^ klingt irgendwie umständlich und langsam... naja ich bräuchte nur einmal im Loading screen

PS hast du eye-Toy?

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group