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

Komunikacija dva DLL-a problem !

[es] :: C/C++ programiranje :: Komunikacija dva DLL-a problem !

Strane: 1 2

[ Pregleda: 4261 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Kvizak_Hadarak
LDP

Član broj: 27319
Poruke: 92
*.dlp167.bih.net.ba.



Profil

icon Komunikacija dva DLL-a problem !11.09.2006. u 22:01 - pre 213 meseci
Pozdrav
Ovako imam jedan problem sa pisanjem jednog dll-a (C++) dva ustvari dll-a jedan poziva drugi koji je vec
neko napravio i koji radi odlicno kada samo njega pozivam iz exe aplikacije sa LoadLibrary ga ucitam i funkcije
fetch-am sa GetProcAddress medjutim moram da ja napisem dll koji ce da koristi taj dll tad problem nastupa
i to oblika:

Unhandled exception at 0x77f60b6f in S2_test.exe: 0xC0000005: Access violation writing location 0x00030fc0.

isti daj dio koda koji sam napisao u svom dll-u za poziv ovog drugog dll radi dobro kad ga zapisem u apilikaciju hmm vrlo cudno
mislio sam da ne mogu pozivati dll iz dll mada tamo pise moze na msdn proba sam napraviti ja neki dll pa ga pozvati u nekom
dll kojeg sam takodje napravio pa to sve pozvao iz test aplikacije sve radi hmm da poludis...
Funkcije u svom dll ssam exportovao sa __cdecspec(dllexport) moze li ko da pomogne, je li ko imao iskustva
sa slicnim problemom svaka pomoc bi dobro dosla .....
vozdra
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
195.252.89.*



Profil

icon Re: Komunikacija dva DLL-a problem !12.09.2006. u 09:03 - pre 213 meseci
Mozes pozivati DLL iz DLL-a bez problema. Proveri podesavanja kompajlera i po mogucstvu definisi calling konvenciju (cdecl, stdcal, ....)
Bez nekog parceta source-a tesko mogu da utvrdim gde je problem. Ako je moguce... pokazi deklaracije funkcija koje exportujes, nacin kako ih fetchujes, i kako ih pozivas, pa da pogledam malo bolje.

 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.55.*



+9 Profil

icon Re: Komunikacija dva DLL-a problem !12.09.2006. u 09:10 - pre 213 meseci
Citat:
yooyo: Mozes pozivati DLL iz DLL-a bez problema. Proveri podesavanja kompajlera i po mogucstvu definisi calling konvenciju (cdecl, stdcal, ....)
Bez nekog parceta source-a tesko mogu da utvrdim gde je problem. Ako je moguce... pokazi deklaracije funkcija koje exportujes, nacin kako ih fetchujes, i kako ih pozivas, pa da pogledam malo bolje.

Ako se koristi MSVC++ mislim da je defaultna konvencija _cdecl, a kod Borlanda je _stdcall. Preporučam korištenje _stdcall konvencije jer neki programski jezici poput VB-a traže da DLL funkcije koriste baš tu konvenciju da bi ih se moglo koristiti.

U svakom slučaju stavi dio koda pa da vidimo o čemu je točno riječ...
 
Odgovor na temu

Kvizak_Hadarak
LDP

Član broj: 27319
Poruke: 92
*.dlp60.bih.net.ba.



Profil

icon Re: Komunikacija dva DLL-a problem !12.09.2006. u 12:40 - pre 213 meseci
Hvala na kometarima evo koda
#include <iostream>
#include <windows.h>
#include "defs.h"
#include "CCOM.h"
using namespace std;

#define DllExport __declspec(dllexport)

extern "C"
{
DllExport int GetSignalLevel()
{
HINSTANCE h;
DWORD AdapterHandle;
TTunerStatus TunerStatus;
char SS2Name[1000];

h=LoadLibrary("SkyDll.dll");
(FARPROC&)SkyOpen=GetProcAddress(h,"SkyOpen");
(FARPROC&)SkyClose=GetProcAddress(h,"SkyClose");
(FARPROC&)SkyAdapterGetHandle=GetProcAddress(h,"SkyAdapterGetHandle");
(FARPROC&)SkyAdapterTunerGet=GetProcAddress(h,"SkyAdapterTunerGet");



if(SkyOpen()) return 4;
if(SkyAdapterGetHandle(0, &AdapterHandle)) return 1;
if(SkyAdapterTunerGet(AdapterHandle, &TunerStatus, sizeof(TunerStatus))) return 2;

if(SkyClose()) return 3;
FreeLibrary(h);

return (int)TunerStatus.u64[2];

}

ima jos funkcija ali ova osnova nece da radi ali kad ovo stavi se u neki cpp sve radi hmm stvarno ne znam niti ovaj dll SkyDll.dll mogu koristi u C# ???
pozdrav
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.55.*



+9 Profil

icon Re: Komunikacija dva DLL-a problem !12.09.2006. u 13:38 - pre 213 meseci
Nisi provjerio da li LoadLibrary uopće vraća handle na dll, a bilo bi bolje i direktno nakon poziva GetProcAddress provjeriti je li se uspjela vratiti adresa funkcije.

U C# se to može koristiti. Evo malog primjera za npr. običnu funkciju sumiranja:
Code:
using System.Runtime.InteropServices;

[DllImport("MojDll.dll")]
static extern int Suma(int a, int b);
 
Odgovor na temu

Kvizak_Hadarak
LDP

Član broj: 27319
Poruke: 92
*.dlp17.bih.net.ba.



Profil

icon Re: Komunikacija dva DLL-a problem !12.09.2006. u 14:46 - pre 213 meseci
Da radio sam prije sa dll ovima u C# bas tako ali ovdje se javalja error kao gore sto sam napomenuo, sto se tice handle-a okay je i address-a funkcije je okay jer sam provjeravao sa disasemblerom sve je okay ali nece da radi ovako je pozivam

int (WINAPIV* GetSignalLevel)();
HMODULE h;

int max =0;

h=LoadLibrary("RASCore.dll");
(FARPROC&)GetSignalLevel = GetProcAddress(h,"GetSignalLevel");

max = GetSignalLevel();

Zakacio sam dll evo pa pogledajte ako mozete

[Ovu poruku je menjao Kvizak_Hadarak dana 12.09.2006. u 16:10 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
195.252.89.*



Profil

icon Re: Komunikacija dva DLL-a problem !12.09.2006. u 21:19 - pre 213 meseci
DllExport int GetSignalLevel() je kad se provuce kroz predprocesor:

Code:
extern "C" __declspec(dllexport) int GetSignalLevel();


Sto znaci da je calling konvencija _cdecl.

prototip za ovu func bi izgledao ovako:

Code:
typedef int (__cdecl * PFNGetSignalLevel)();
\

u DLL-u odakle pozivas GetSignalLevel uradi ovako:

Code:

PFNGetSignalLevel GetSignalLevel;
...
h = LoadLibrary("xxx.dll");
GetSignalLevel = (PFNGetSignalLevel)GetProcAddress(h, "GetSignalLevel");

int signal = GetSignalLevel();



 
Odgovor na temu

Kvizak_Hadarak
LDP

Član broj: 27319
Poruke: 92
*.dlp188.bih.net.ba.



Profil

icon Re: Komunikacija dva DLL-a problem !14.09.2006. u 00:31 - pre 213 meseci
Pa yooyoo u cemu je razlika to sto ja radim i to sto ti predlazes kad je to same shit hmhmm
da li se problem moze vezati za to sto nisam napisao DllMain funkciju tamo pise da je proizovljno to i da je sam generise kompailer ili vec ???
vozdra
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.dynamic.sbb.co.yu.



Profil

icon Re: Komunikacija dva DLL-a problem !14.09.2006. u 12:02 - pre 213 meseci
Hmm.. ni ja ne pishem DllMain, pa nemam takvih problema. Ukratko.. ako je ucitavanje DLL-a uspesno i mapiranje funkcije takodje uspesno, a poziv funkcije izaziva crash onda je ili funkcija bagovita ili imas problem sa calling konvencijom. Nemoj se oslanjati na WINAPIV i slicne konstrukcije jer im se menja znacenje od podesavanja projekta. Moze se desiti da su DLL-ovi kompajlirani sa razicitim podesavanjima i da to pravi problem.

Ja sam ti napisao kako ja radim i nemam problema. Ti mozes da probas moj nacin ili da i dalje trazis uzrok problema.
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.55.*



+9 Profil

icon Re: Komunikacija dva DLL-a problem !14.09.2006. u 12:03 - pre 213 meseci
Citat:
Kvizak_Hadarak: Pa yooyoo u cemu je razlika to sto ja radim i to sto ti predlazes kad je to same shit hmhmm
da li se problem moze vezati za to sto nisam napisao DllMain funkciju tamo pise da je proizovljno to i da je sam generise kompailer ili vec ???
vozdra
Meni par dll-ova nije radilo baš zato što nema DllMain funkcije.
 
Odgovor na temu

Kvizak_Hadarak
LDP

Član broj: 27319
Poruke: 92
*.dlp187.bih.net.ba.



Profil

icon Re: Komunikacija dva DLL-a problem !14.09.2006. u 15:40 - pre 213 meseci
Sve je to okay dobijem ja handle i pokazivac na funkciju ali se srusi nakon njenog pozivanja sve bi to bilo okay da on ne radi sam
ali kad ga covjek pozove iz neke aplikacije samog direktno radi dovraga....
ma okay je ta notacija yooyoo radi ona kao i ova direktno ali indirektno preko drugog dlla nece... nema resursa vise ni ideja hmm ne znam sta da se cini ...
vozdra
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.dynamic.sbb.co.yu.



Profil

icon Re: Komunikacija dva DLL-a problem !14.09.2006. u 16:49 - pre 213 meseci
hmmm SkyOpen, SkyClose, ... Mozda pokusavas da iskoristis neciji DLL? Da li imas prototipove funkcija koje pozivas? Mozda treba da odradis nesto pre poziva funkcije, (npr inicijalizacija COM-a) ili nesto slicno.

 
Odgovor na temu

Kvizak_Hadarak
LDP

Član broj: 27319
Poruke: 92
*.dlp23.bih.net.ba.



Profil

icon Re: Komunikacija dva DLL-a problem !14.09.2006. u 22:15 - pre 213 meseci
Pa naravno dakoristim tudji dll ko ga je napravio neam pojam a imam prototipe cojek zar ne citas sta pisem kazem ti da radi taj dll sve okay kad samo njega pozivam ali kad ga pozovem u aplikaciju kroz drugi dll nastane stranje ....
vozdra
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.55.*



+9 Profil

icon Re: Komunikacija dva DLL-a problem !15.09.2006. u 08:57 - pre 213 meseci
Citat:
Kvizak_Hadarak: Pa naravno dakoristim tudji dll ko ga je napravio neam pojam a imam prototipe cojek zar ne citas sta pisem kazem ti da radi taj dll sve okay kad samo njega pozivam ali kad ga pozovem u aplikaciju kroz drugi dll nastane stranje ....
vozdra
Izbaci bezobrazluk jer ovdje tebi ne vjerujem da je itko išta dužan. Ako hoćeš da te se razumije onda bi ti bolje preporučio da pišeš čitko, a ne da treba po pola sata da bi se ovo gore što nalikuje na tekst moglo dešifrirati.
 
Odgovor na temu

Kvizak_Hadarak
LDP

Član broj: 27319
Poruke: 92
*.dlp91.bih.net.ba.



Profil

icon Re: Komunikacija dva DLL-a problem !15.09.2006. u 22:32 - pre 213 meseci
Ne vidim razlog zbog cega nerviranje i vrijedjanje napisao sam vam sta mi se desava a vi mi predlazete nesto sto vec radi
ako ne zelis POMOC itf ne moras niko te ni nasta ne primorava ....
pozdrav
 
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: Komunikacija dva DLL-a problem !16.09.2006. u 00:35 - pre 213 meseci
Pogledao sam ono što si poslao u rar arhivi i te tvoje definicije su potpuno proizvoljne i netačne.

Način za dinamičko povezivanje funkcija iz dll-a koji si poslao je iz vremena windowsa 3.1 i ne koristi se u modernim verzijama windowsa. Sve funkcije iz dll-a koriste __cdecl konvenciju.

Tačan opis nekih funkcija može se naći ovde:

http://ss2.planetsat.ru/ss2api.htm

Evo ispravnog hedera sa funkcijama za bilo koji windows kompajler koji sam napisao i probao:

Code:

#ifndef SKYAPI_HH
#define SKYAPI_HH

#ifdef __cplusplus
extern "C" {
#endif

#ifndef WINAPIV
#define WINAPIV __cdecl
#endif

struct TTunerStatus
{  
   DWORD freq;       // khz 
   DWORD lof;        // khz 
   DWORD sr;         // ksym 
   DWORD fec; // 0=auto 1=1/2 2=2/3 3=3/4 4=5/6 5=7/8 6=auto
   DWORD pol; // 0=horizontal 1=vertical; 
   DWORD lnb_switch; // 0 
   DWORD diseqc;     // 0=none $10002=SimpleA $10006=SimpleB 
                          // $20002=Pos_A - Opt_A 
                          // $20006=Pos_B - Opt_A 
                          // $2000A=Pos_A - Opt_B 
                          // $2000E=Pos_B - Opt_B 
   DWORD u1;         // ? 
   DWORD sigq;       // value 3 if tuner locked / çíà÷åíèå 3 åñëè òþíåð çàëî÷åí
   DWORD u2;         // ? 
   DWORD u3;         // 1 - this value gets in time while switching tuner an another freq 
   DWORD u4;         // ? 
   DWORD u5;         // ? 
   DWORD sig_str;    // signal strength 0-100 (but realy there is something wrong (values like 0, 128, 255)) 
   DWORD u6;         // ? 
   DWORD u7;         // ? 
   BYTE u161;   // ? u16[1] - 232 unknown  if driver < 4.3.0 / 1
   BYTE u162;   // ? u16[2] - 3 = tuner locked = sigq   / 1
   BYTE u163;   // ? u16[3] - unknown   / signal level
   BYTE u164;   // ? u16[4] - unknown   / unknown
   BYTE u165;   // ? u16[5] - 1   / unknown
   BYTE u166;   // ? u16[6] - 1   / unknown
   BYTE u167;   // ? u16[7] - signal level = u64[3]
   BYTE u168;   // ? u16[8] - value = sig_str
  DWORD u64[30];   // ? u64[3] - real tuner signal level 0-100 / ðåàëüíûé óðîâåíü ñèãíàëà
          // u64[1]/1000 = SNR (if drivers >= 4.3.0)
};

struct DVBS
    {
        bool        Result;
        int            Frequency;   //
        int         SymbolRate;
        //int         Modulation;
        int         Polarity;
        int         LnbFreq;
        int            LnbKhz;
        int         Fec;
        int         AdapterCount;
        float         SNR;
        float         BER;        
        float         SignalQuality;
        int         TotalBlocks;
        int         Bandwidth;
        float       SignalLevel;
        int         MinTransponderFreqInKHz;
        int         MaxTransponderFreqInKHz;
        int         MinTunerFreqInKHz;
        int         MaxTunerFreqInKHz;
        int         MaxSymbolRateInBaud;
        int         MinSymbolRateInBaud;
        int         AutoSymbolRate;
};

typedef int (WINAPIV* SkyOpenType)(char*);

typedef int (WINAPIV* SkyCloseType)(void);

typedef int (WINAPIV* SkyGetNumAvailAdaptersType)(DWORD*);

typedef int (WINAPIV* SkyAdapterGetHandleType)(int, DWORD*);

typedef int (WINAPIV* SkyAdapterGetNameType)(int, char[38]);

typedef int (WINAPIV* SkyAdapterTunerGetType)(DWORD, TTunerStatus*,int);

typedef int (WINAPIV* SkyAdapterTunerSetType)(DWORD, TTunerStatus*,int);

#ifdef __cplusplus
}
#endif

#endif /* SKYAPI_HH */


A evo i kratkog primera kako ucitavati i pozivati funkcije:

Code:

void testskyapi()
{
  HINSTANCE libHandle_ = ::LoadLibrary("SkyDll.dll");
  if (NULL == libHandle_) {
    return;
  }// end if

  //
  SkyOpenType SkyOpen = reinterpret_cast<SkyOpenType>(::GetProcAddress(libHandle_,"SkyOpen"));
  SkyCloseType SkyClose = reinterpret_cast<SkyCloseType>(::GetProcAddress(libHandle_,"SkyClose"));
  SkyGetNumAvailAdaptersType SkyGetNumAvailAdapters = reinterpret_cast<SkyGetNumAvailAdaptersType>(::GetProcAddress(libHandle_,"SkyGetNumAvailAdapters"));
  char value[1000] = {0};
  int result = SkyOpen(value);
  if (result == 0) {
    ShowMessage(AnsiString(value));
    SkyClose();
  }
  
  ::FreeLibrary(libHandle_);

}



Tko leti vrijedi
 
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: Komunikacija dva DLL-a problem !16.09.2006. u 15:53 - pre 213 meseci
Citat:

Ako se koristi MSVC++ mislim da je defaultna konvencija _cdecl, a kod Borlanda je _stdcall.


Ovo je netacno. Svi windows kompajleri (pa i Borlandov) po defaultu koriste __cdecl. Kao i sve drugo i ovo se moze promeniti pa je zato uvek preporucljivo definisati u hederima koja konvencija se koristi za neku funkciju/klasu/promenjivu itd.


Tko leti vrijedi
 
Odgovor na temu

Kvizak_Hadarak
LDP

Član broj: 27319
Poruke: 92
*.dlp489.bih.net.ba.



Profil

icon Re: Komunikacija dva DLL-a problem !17.09.2006. u 00:21 - pre 213 meseci
Pozdrav kiklop74
Ovako meni funcija DWORD (WINAPIV* SkyOpen)(char *) nece da radi sobzirom na ovu definiciju oce ovako zato
DWORD (WINAPIV* SkyOpen)() tako je i prikazana u PEDisassembler-u tj kao DWORD SkyOpen() druga stvar nemam vise onog exception-a sada dobra stvar ali mi vraca da SkyOpen da ne moze da otvori karticu tj vrati 1 a treba 0.....
Da li Vi mozete importovati SkyDll.dll u C# meni nece vraca opet i tamo 1 funkcija SkyOpen()...
Pozdrav
 
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: Komunikacija dva DLL-a problem !17.09.2006. u 03:14 - pre 213 meseci
Ja sam probao dll koji si poslao i sa definicijom funkcija koje sam postovao sve funkcije se pozivaju kako treba.

E sad sto ne rade kako ti mislis da treba da rade - nemam pojma.

Ja nisam nicija besplatna tehnicka podrska, ovo sto sam postovao je bila cista dobra volja. Dalje ne mogu da pomognem moraces da se snadjes sam.

I ubuduce se trudi da pises preciznije. Nacin na koji pises poruke ti ni malo ne pomaze u komunikaciji ovde na forumu.




Tko leti vrijedi
 
Odgovor na temu

Kvizak_Hadarak
LDP

Član broj: 27319
Poruke: 92
*.dlp373.bih.net.ba.



Profil

icon Re: Komunikacija dva DLL-a problem !17.09.2006. u 20:17 - pre 213 meseci
Pa nisam ni mislio da ste mi Vi tehnicka podrska niti bi zelio da budete, ljepo sam pitao ne vidim razlog sto ste svi vi nesto ljuti, napeti ja sam pitao za pomoc a ne zahtjevao. Jesam li ja igdje izricito zahjtevao sta ???????????
Ovo je valjda forum gdje bi osobe zelje da podjele iskustva sa ostalim hmmm ne znam kako ga Vi vidite nije ni bitno...
A sto se tice vaseg prvog odgovora vi meni niste nista odgovorili povodom datog problema samo ste mi rekli ono sto vec mi radi meni je problem iportovati taj SkyDll.dll u drugi dll nece tamo da radi ako niste upuceni....
hvala vam svima na pomoci........
 
Odgovor na temu

[es] :: C/C++ programiranje :: Komunikacija dva DLL-a problem !

Strane: 1 2

[ Pregleda: 4261 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

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