Votes given by hacktooth

CAT_IMG Posted: 12/2/2011, 10:33 by: /dev/random     +1[GUIDA] Scrivere DLL in C e usarle in AutoIt - Guide
Mi ricordo che qualche tempo fa, qualcuno aveva aperto un topic dicendo che aveva creato una DLL che però non funzionava con AutoIT, non mi ricordo perché e neanche qual era il topic (non lo trovo :D).
Anzi forse adesso che ci penso funzionava anche, però scrivo uno pseudo-tutorial dai xD

Chi lo legge mi paga 10 euri xD (xMasteRx me ne dà solo 100 dai xDxDxD)

Avviate il vostro IDE, Nuovo progetto, quando ve lo chiede scegliete qualcosa che contenga "DLL", "Libreria dinamica", "Libreria win32", "Libreria DLL Dinamica Win32 (ok questo è xD)".

Adesso se non ve li crea il vostro IDE, create due file, un header (.h) e un normale sorgente c (.c).

Dentro l'header dovete mettere i prototipi delle vostre funzioni (ad esempio la funzione "saluta" che troverete qui sotto).

Un esempio di header:

CODICE
#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL // roba di windows
# define DLLIMPORT __declspec (dllexport) // se la sto compilando
#else
# define DLLIMPORT __declspec (dllimport) // se non la sto compilando
#endif

// qui ci vanno i vostri prototipi
// ricordate che le funzioni delle dll sono di tipo DLLIMPORT
// altrimenti possono essere usate solo da altre funzioni
// all'interno della DLL ma non richiamate dall'esterno.
DLLIMPORT int Saluta(char* chi);


#endif // da lasciare, è l'endif dell'ifndef in alto xD


Salvatelo nella cartella che avete creato per il progetto (non mettete tutto in una sola cartella, vero? xD).

Passiamo al codice della DLL:

CODICE
#include "dll.h" // al posto di dll.h mettete il nome con cui avete salvato l'header
#include <windows.h> // per le costanti e MessageBox
#include <string.h> // per strcat e strlen

#define BUFFER 128

DLLIMPORT void Saluta(char* chi) // ecco la nostra funzione
{
   char text[100] = "Ciao, "; // un po' di spazio per il testo con la prima parte già scritta
   if (strlen(chi) == 0) // se la stringa è vuota (lunga 0)
   {
       chi = "Nessuno"; // allora saluto Nessuno xD
   }
   MessageBox(0, strncat(text, chi, BUFFER - strlen(text)), "Ciao!", 0); // concateno e messageboxo
}


BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved) // da lasciare
{
// in alcuni ide c'è uno switch che non fa niente se non rallentare,
// ma dato che windows si accontenta di un return TRUE, diamogli
// un return true :D
   return TRUE;
}


Compilate, aprite SciTE e create un nuovo script in una cartella a piacere, dove ci metterete anche la DLL.

Scrivete:
CODICE
DllCall("nomedll.dll", "cdecl:none", "Saluta", "str", "/dev/random")
DllCall("nomedll.dll", "cdecl:none", "Saluta", "str", "")


Lasciate sempre il cdecl: altrimenti (non capisco perché) AutoIT crasha dopo aver richiamato la funzione (che funziona comunque xD).

Se avete fatto tutto giusto vedrete :D

Ciao!

Edited by /dev/random - 12/2/2011, 15:56
1 replies since 4/10/2010