Spraudņi(Plugins) (2)

Izskatās, ka neviens šai komūnā nevēlas neko īpaši rakstīt. Nu tad laikam tas būs jādara man. Tā kā komūna veltīta programmēšanas valodām, tad loģiski, ka raksts būs par programmēšanu. Es pats vislabprātāk kodēju C/C++ valodās, tādēļ arī raksts būs par šo tēmu. Konkrētāk vēlos parunāt par tādu lietu kā spraudņu(plugins) veidošana. Esmu noklausījies vismaz kādus 5-6 kursus par kodēšanu, taču nevienā par šo tēmu pat netika pieminēts. Tādēļ nācās vien rakt pašam. Līdz ar to piedodiet, ja gadās kāda kļūda - mēs visi mācamies.
Sāksim ar to, kas tad spraudņi vispār tādi ir. Ja runājam par OS Windows, tad tie parasti ir faili ar paplašinājumu dll. Programmas autors nosaka, kādām funckijām ir jābūt realizētām bibliotēkās, kas vēlas sevi uzskatīt par šī konkrētā softa spraudņiem. Tad spraudņa izstrādātājam atliek tikai realizēt kaudzīti ar funcijām, kurām ir noteikti parametri un konkrēts atgriežamais tips. Rezultātā ir iespējams mainīt programmas uzvedību nepārkompilējot visu programmu. Pietiek ar spraudņa ievietošanu vajadzīgajā direktorijā ar vajadzīgo nosaukumu, vai arī ini vai config faila rediģēšanu.
Lūk piemērs, kā realizēt programmu, kas spēj izmantot spraudņus valodā C.

//windows.h fails ir nepieciešams, lai izmantotu funkcijas LoadLibrary un GetProcAddress
#include <windows.h>
//definējam funkcijas tipu, ko sagaidam no spraudņa
typedef int (MyFunctionType)(char*);
int main(int argc, char ** argv){
HMODULE library;//rādītājs uz spraudni
library = LoadLibrary("my_plugin.dll");
if(!library){//ja neizdevās ielādēt spraudni
printf("Kluda ieladejot plugin failu\n");//izvadam ziņojumu par kļūdu
}
else{//pretējā gadījumā
//ielādējam vajadzīgo spraudņa funciju
MyFunctionType * f = (MyFunctionType *)GetProcAddress(library,"myFunction");
if(!f){//ja neizdevās ielādēt vajadzīgo funkciju
//izvadam ziņojumu par kļūdu
printf("Neizdevas ieladet vajadzigo funkciju");
}
else{//pretējā gadījumā
//izmantojam funkciju f kā jebkuru citu funkciju
printf("Rinda sastav no %i simboliem\n",f("Hello, World!!!"));
}
}
return 0;
}

Es kompilēšanai izmantoju gcc komilatoru. Tā ir gaumes lieta. Ja kāds ir baigais Microsoft vai Borland piekritējs, droši varat lietot attiecīgi cl vai bcc32. Tikai ņemiet vērā, ka tad visdrīzāk būs jāizmanto nedaudz savādāki komandu parametri.
Tātad lai nokompilētu šo piemēru, komandrinā pārejiet uz direktoriju, kur glabājas programmas kods. Pieņemsim, ka tas ir saglabāts failā ar nosaukumu main.c. Izpildiet komandu

gcc main.c -o mySoft.exe

Rezultātā vajadzētu parādīties failam mySoft.exe. Varat pamēģināt to palaist no komandrindas. Visticamāk tiks izvadīta rinda "Kluda ieladejot plugin failu". Tas ir normāli, jo direktorijā netiks atrasts fails my_plugin.dll. Tagad ķersimies pie šī faila veidošanas

//string.h vajadzīgs, lai izmantotu funkciju strlen()
#include <string.h>
//funckija vienkārši saskaitīs un atgriezīs simbolu skaitu rindā.
int myFunction(char* str){
return strlen(str);
}

tagad jānokompilē jaunizveidotais spraudnis. Pieņemot, ka programmas teksts ir saglabāts failā plugin.c, To var izdarīt ar komandu

gcc -shared plugin.c -o my_plugin.dll

Tagad direktorijā jābūt četriem failiem(main.c,plugin.c,mySoft.exe un my_plugin.dll). Palaižot no komandrindas failu mySoft.exe, redzēsiet atbildi "Rinda sastav no 15 simboliem".

Ja kādam šis raksts likās noderīgs un vēlētos uzzināt vairāk par šo tēmu, rakstiet komentārus vai sūtiet vēstules. Nepieciešamības gadījumā varu pastātstīt, kā kaut ko tamlīdzīgu uzkodēt Linux vidē.

C/C++ - vai ir vērts? (1)

Kodēt sāku vēl vidusskolā. Atčķirībā no daudziem citem, kas sāk iepazīties ar programmēšanu Basic vai Pascal valodās, uzr...

mja (2)

lai cik interesanti komūnu virsraksti nebūtu, žēl ka tajos neko navar interesantu izņemot virsrakstu izlasīt. :(

Īss aprakstsVairāk

Tātad komūna par un ap programēšanu vispār un/vai kādā no daudzajām valodām.

Komūnas biedriRādīt visus