DLL hin und DLL her
Übersicht

![]() |
Silver_KneeBetreff: DLL hin und DLL her |
![]() Antworten mit Zitat ![]() |
---|---|---|
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() {
aus diesem Post
static char* s = "Dies ist ein String."; return s; } und Code: [AUSKLAPPEN] BOOL WINAPI DllMain( HANDLE hInstDLL, DWORD dwReason, LPVOID lpvReserved ); 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: |
||
- Zuletzt bearbeitet von Silver_Knee am Mo, Jan 07, 2008 18:47, insgesamt einmal bearbeitet
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ach himmel mein ich doch ![]() *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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group