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