Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

vratiti pointer na niz karaktera iz dll-a

[es] :: C/C++ programiranje :: vratiti pointer na niz karaktera iz dll-a

[ Pregleda: 2689 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

zrnvltc
zoran vuletic
stomatolog

Član broj: 221088
Poruke: 28
93.86.17.*



Profil

icon vratiti pointer na niz karaktera iz dll-a24.06.2009. u 03:56 - pre 180 meseci
Pozdrav
Treba mi primer kako da definisem funciju koja iz
dll-a vraca neki string ( char * Funkcija() )

i kako da iz neke forme ucitam pozovem tu funkciju
i procitam taj pointer na niz karaktera.

Jednostavno nisam nasao na net-u za char*
samo primere za int bool

hvala
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: vratiti pointer na niz karaktera iz dll-a24.06.2009. u 09:48 - pre 180 meseci
Upravo to što si napisao (char * Funkcija()) je jedno moguće rešenje. Naravno, treba ti i ono __declspec(dllextern), a uglavnom se koristi i ono __stdcall, ali ta dva nemaju veze sa baferima, to uvek treba. Šta si ti pokušao, a šta ne valja u tome što si pokušao? Ima nekih drugih problema u mešanju bafera i dll funkcija, ali nije problem da naraviš funkciju.

Ako koristiš char * Funkcija() onda je sledeće pitanje da li bafer kreiraš unutar te funkcije, ili je to samo pokazivač na nešto. Ako kreiraš onda bafer mora i da se obriše u nekom trenutku.

Code:
char * blabla = Funkcija();
...
// Ovde obrisati blabla. Ili ćeš delete[] blabla, ili napraviš funkciju dll-a Delete(blabla). Preporučujem ovo drugo.
 
Odgovor na temu

zrnvltc
zoran vuletic
stomatolog

Član broj: 221088
Poruke: 28
93.86.17.*



Profil

icon Re: vratiti pointer na niz karaktera iz dll-a24.06.2009. u 16:45 - pre 180 meseci
jevlja mi u app koja poziva dll
access violation ..... in module "version.dll"
primer koda u dll-u je:
Code:

   DWORD dwSize = GetFileVersionInfoSize(vInfo, &dwDummy);
   char *lpData = new char[dwSize];
   // ........
   // ........
   delete [] lpData;     // >>> ovde puca
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: vratiti pointer na niz karaktera iz dll-a24.06.2009. u 17:03 - pre 180 meseci
Te tri linije na prvi pogled deluju okej, ali premalo si informacija dao. Moraćeš sam da debaguješ korak po korak, ili da ovde pošalješ kompletan a minimalan kod koji ti pravi problem. S druge strane nije mi jasno sledeće: ako u dll-u brišeš bafer lpData šta onda vraća funkcija?

Access violation se javlja kad pristupiš nepristupačnom delu memorije. U tvom slučaju to možda znači da lpData pokazuje na neku nebulozu. Moraćeš sam da utvrdiš kako i otkud. Debagovanje dll-a je isto kao i debagovanje glavne aplikacije, stisni F11 (u Visual Studiu) pred ulazak u funkciju i ulaziš unutra :-)
 
Odgovor na temu

baseQ
Petrovic Braca
Beograd

Član broj: 125370
Poruke: 70
93.87.213.*



Profil

icon Re: vratiti pointer na niz karaktera iz dll-a25.06.2009. u 18:57 - pre 180 meseci
Aplikacija koja poziva dll:
U Unit1.h recimo klasi forme:
Code:

private:
   typedef char* __declspec(dllimport) CallFunkcija();   // deklaracija
   CallFunkcija * Poziv;


u Unit21cpp-u:
Code:

   // Prvo ucitavamo Dll.
   HINSTANCE Dll = LoadLibrary(".....putanja\\Moj.dll");
   // Provera da li je Dll ucitan
   if (Dll)
   {
      // Uzimamo adresu funkcije.
      Poziv= (CallFunkcija *)GetProcAddress(Dll, "_Funkcija");
      // e sad Poziv() je u stvari pozivanje funkcije isto kao Funkcija();
      ShowMessage(Poziv());
      // Na kraju oslobadjamo dll.
      FreeLibrary(Dll);
   }
   else
      ShowMessage("error nije ucitan dll bla bla bla..."); 


A u dll-u
Code:

extern "C" __declspec(dllexport) char * Funkcija();    // deklaracija

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
   return 1;
}


i normalno implementacija Funkcije:
Code:

char * Funkcija()
{
   char nekicar[256];
   char *rezultat;
   //....................................
   //....................................
   //....................................
   return rezultat;
}

'Think evolution, not revolution.'
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.dynamic.sbb.rs.



+7 Profil

icon Re: vratiti pointer na niz karaktera iz dll-a25.06.2009. u 23:11 - pre 180 meseci
Da nisi uradio nesto ovako?
Code:

char* lpData = new char[dwSize];
// ........
lpData = Funkcija();//iz dlla
// ........
//eventualno
//FreeLibrary(Dll);
delete [] lpData;    

i sta se desava u fn sa rezultat , jel imas new
Mozes da stavis new u Funkcija() , znaci char* rezultat = new char[]
a delete u glavnom programu
npr.
Code:

//dll
char * Funkcija()
{
   char *rezultat = new char[nesto];
   //....................................
   return rezultat;
}
// a ovamo
char* lpData = Funkcija();
//...
if(lpData)
   delete[] lpData;
FreeLibrary(Dll);

 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.fibertel.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: vratiti pointer na niz karaktera iz dll-a27.06.2009. u 11:25 - pre 180 meseci
Najbezbedniji je pristup koji se u vecini slucajeva koristi u Windows API funkcijama:

Code:

//dll funkcija
extern "C" {
  void __declspec(dllexport) __stdcall getStringValue(char* &buffer, int buffsize) {
     strcpy(buffer,"sample string");
  }
}

// poziv funkcije u aplikaciji
const int bsize = 100;
char pbuff[bsize] = {0};

getStringValue(pbuff,bsize);

std::cout << pbuff << std::endl;



Gornja verzija je vise c++ manir (i svakako preporucen ako koristis c++) a ako bi bio u pitanju cisti C onda bi to izgledalo ovako:

Code:

//dll funkcija
  void __declspec(dllexport) __stdcall getStringValue(char** buffer, int buffsize) {
     strcpy(*buffer,"sample string");
  }

// poziv funkcije u aplikaciji
char pbuff[100];
memset(pbuff,0,100);
char *p=pbuff;
getStringValue(&p,bsize);





Tko leti vrijedi
 
Odgovor na temu

[es] :: C/C++ programiranje :: vratiti pointer na niz karaktera iz dll-a

[ Pregleda: 2689 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.