Hej,
Jeg har en DLL som jeg gerne vil anvende nogle funktioner i. DLL'en er
en wrapper for nogle low-level bluetooth funktioner. Mit problem er at
en af de vigtige funktioner returnere en object af en "ukendt" klasse.
Eller dvs at jeg har definitionen af klassen i C++, men hvordan får jeg
den ind i Delphi?
Lidt simplificeret så har jeg følgende stående i dokumentationen:
int _stdcall InitBMDll(char* dllName)
CInquiry* _stdcall GetCInquiry()
int _stdcall CleanBMDll()
Dette har jeg så omsat til delphi:
function InitLibrary(dllName: pchar): integer; stdcall; external
'BM_Dll.dll' name 'InitBMDll';
function GetCInquiry: pointer; stdcall; external 'BM_Dll.dll';
function CleanBMDll: integer; stdcall; external 'BM_Dll.dll';
Både initializeringen og "oprydningen" fungere fint (der findes
yderligere nogle funktioner i DLL'en som jeg kan bruge til tests, så jeg
ved det virker)...
MEN, hvordan hulen skal jeg kunne bruge den pointer jeg får tilbage fra
GetCInquiry?
Jeg har klassedefinitionen i C, men det kan vel ikke rigtigt hjælpe mig,
kan det? Den er rimlig stor, men kommer her alligevel:
**********Klippet direkte fra dokumentationen**********
// Device inquiry & pairing
class BARAMAN3_API CInquiry
{
public:
static CInquiry* GetInstance();
// Pairing related functions
typedef enum {
SUCCESS,
ALREADY_BONDED,
BAD_PARAMETER,
FAIL
} BOND_RETURN_CODE;
virtual BOND_RETURN_CODE Bond(BD_ADDR bda, LPTSTR pin_code) const;
virtual BOOL BondQuery(BD_ADDR bda) const;
virtual BOOL UnBond(BD_ADDR bda) const;
// Is device ready
virtual BOOL GetLocalDevice(BD_ADDR bda = NULL) const;
// Device discovery
virtual BOOL StartFindDevices(const BOOL flush = TRUE, const DEV_CLASS
devClass = DummyClass);
virtual void StopFindDevices();
virtual int GetInquiryCount() const;
virtual int GetNext(const int ind, BD_NAME name, BD_ADDR bda, DEV_CLASS
cl) const;
typedef enum {
SPP,
HST,
A2DP,
DUN,
} SERVICE_TYPE;
// Service discovery
virtual BOOL StartDiscoverServices(BD_ADDR adr, SERVICE_TYPE type);
virtual int GetSppServicesInfo(const BD_ADDR BdAddr, UINT8 &scn, TCHAR*
serviceName);
// Parent window registration
virtual void RegisterWindow(const HWND hwnd);
// Autoconnect
virtual void SetAutoConnectManager(CAutoConnect* pManager);
// SPP GUID
static const GUID guid_SERVCLASS_SERIAL_PORT;
// HST GUID
static const GUID guid_SERVCLASS_HEADSET;
// DUN GUID
static const GUID guid_SERVCLASS_DIALUP_NETWORKING;
// A2DP GUID
static const GUID guid_SERVCLASS_A2DP;
#ifdef _COMONE_PLATFORM
// Baracoda internal use
virtual void SetDelegate(BaracodaPtrType ptr) { m_Delegate = ptr; }
virtual void SetPINDelegate(PINPtrType ptr) { m_PINDelegate = ptr; }
virtual void SetDeviceFoundDelegate(PINPtrType ptr) { m_DFDelegate =
ptr; }
#endif
private:
// Singleton
CInquiry();
CInquiry(const CInquiry&);
CInquiry& operator= (const CInquiry&);
~CInquiry();
static CInquiry* instance;
void OnDeviceResponded(const BD_ADDR bda, const DEV_CLASS devClass,
const BD_NAME bdName, const BOOL bConnected);
void OnInquiryComplete(const BOOL success, const short num_responses);
void OnDiscoveryComplete();
BOOL SetLinkTimeout(BD_ADDR bda, UINT8 tmo);
GUID m_pServiceGuid;
HWND m_RemoteHwnd;
CAutoConnect* m_pManager;
#ifdef BARAMAN3_API
friend BARAMAN3_API int _stdcall BMUnRegister();
#endif
friend class CBlueIf;
friend class CBtDevice;
CBlueIf* m_BtIf;
int m_NumDevices;
CBdInfo* m_pDevInfo[MAX_SERVER_DEVICES];
#ifdef _COMONE_PLATFORM
friend void GAP_Event_Handler(unsigned long msgType, void* msg);
BaracodaDelegate m_Delegate;
PINDelegate m_PINDelegate;
PINPtrType m_DFDelegate;
#endif
};
********Slut på klip********
Når det er almindelige typer der skal konverteres(int, strings osv) så
plejer jeg at kunne få tingene til at passe. Men med klasser bliver det
pludselig en anden sag, jeg kan slet ikke gennemskue hvordan jeg på
nogen måde kan få alt ovenstående til at passe...hvis bare en ting er
forkert "vil hele læsset jo vælte", ik?
Hvordan bør jeg gribe dette an?
Alle former for input, tanker, etc. er yderst velkommen da jeg er på
helt bar bund her
På forhånd tak....
MVH
Thomas