[C++B] Biblioteka dll

0

Witam!
Mam pilną sprawę :/ na jutro muszę mieć to gotowe :( zostałem przyciśnięty..
Mam bibliotekę dll do obsługi procesora AT90S2313 przez port USB. W niej zdefiniowaną funkcję:

int __stdcall DoEEPROMWrite(uchar Address, uchar DataOutByte);
int __stdcall DoEEPROMRead(uchar Address, uchar * DataInByte);

Do pierwszej udało mi się odwołać bez problemu.. natomiast z drugą mam problem ponieważ poprzez wskaźnik DataInByte zwraca wartość.. tylko, że nie wiem jak ją odczytać :/

Potrzebuje pilnie pomocy :/

//$$---- Form CPP ----
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "main.h"
//---------------------------------------------------------------------------
extern "C" __declspec(dllimport) int DoEEPROMWrite(char Address, char DataOutByte);
extern "C" __declspec(dllimport) int DoEEPROMRead(char Address, char * DataInByte);
char tmp_znak;
//---------------------------------------------------------------------------
void EEPROMWrite(char adres, char znak)
{
	HANDLE DLLHandle = LoadLibrary("IgorUSB.dll");
	if(DLLHandle != NULL)
	{
		typedef (*aDoEEPROMWrite)(char,char);
		aDoEEPROMWrite _DoEEPROMWrite = (aDoEEPROMWrite)GetProcAddress(DLLHandle, "DoEEPROMWrite");
		if(_DoEEPROMWrite != NULL) _DoEEPROMWrite(adres,znak);
	}
	else // jeśli nie znaleziono biblioteki.
	{
		ShowMessage("Nie znaleziono wymaganej biblioteki 'IgorUSB.dll'");
	}
}
void EEPROMRead(char adres)
{
	HANDLE DLLHandle = LoadLibrary("IgorUSB.dll");
	if(DLLHandle != NULL)
	{
		typedef (*aDoEEPROMRead)(char,char);
		aDoEEPROMRead _DoEEPROMRead = (aDoEEPROMRead)GetProcAddress(DLLHandle, "DoEEPROMRead");
		if(_DoEEPROMRead != NULL) _DoEEPROMRead(adres,tmp_znak);
	}
	else // jeśli nie znaleziono biblioteki.
	{
		ShowMessage("Nie znaleziono wymaganej biblioteki 'IgorUSB.dll'");
	}
}
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TF_main *F_main;
//---------------------------------------------------------------------------
__fastcall TF_main::TF_main(TComponent* Owner)
	: TForm(Owner)
{
	HANDLE DLLHandle = LoadLibrary("IgorUSB.dll");
	if(DLLHandle == NULL)
	{
		ShowMessage("Nie znaleziono wymaganej biblioteki 'IgorUSB.dll'");
		B_zapis_tekstu->Enabled=false;
		B_odczyt_tekstu->Enabled=false;
	}
}
//---------------------------------------------------------------------------


void __fastcall TF_main::B_zapis_tekstuClick(TObject *Sender)
{
	char ile_znakow,i,tmp_char;
	ile_znakow=E_tekst->Text.Length();
	for (i=0;i<ile_znakow;i++)
	{
		tmp_char=E_tekst->Text[i+1];
		EEPROMWrite(i,tmp_char);
	}
	for (i=ile_znakow;i<127;i++) EEPROMWrite(i,0);
}
//---------------------------------------------------------------------------


void __fastcall TF_main::B_odczyt_tekstuClick(TObject *Sender)
{
	EEPROMRead(2);
}
//---------------------------------------------------------------------------
0

Nie wiem czy dobrze zrozumiałem o co Ci chodzi.

Jeżeli do funkcji przekazujesz ten wskaźnik na tą zmienną DataInByte i wewnątrz funkcji służy ona do odebrania jakiegoś wyniku to zdefiniuj sobie jakąś zmienną globalną typu char i chyba tyle.

Ale jak nie o to chodzi to niestety nie pomogę :)

Pozdrawiam

0

W skrócie chodzi o to, że:
Address - jes to adres w pamięci
DataInByte - jest to wartość zapisana pod tym adresem.
Funkcja:

DoEEPROMRead(char Address, char * DataInByte);

Służy do odczytania wartości pod wskazanym adresem. Nie wiem jak ją odczytać.

Może dla ułatwienia pełen opis funkcji:

function DoEEPROMRead(Address:byte; var DataInByte:byte):integer; stdcall;

Function reads byte from given address of microcontroller data EEPROM.

Parameters
Address
[in] Byte which bits represents address of internal EEPROM (valid address range: 0 to 127).
DataInByte
[out] Value from EEPROM.

Return values
If the function succeeds, the return value is NO_ERROR.
If the function fails, the return value is DEVICE_NOT_PRESENT (device is disconnected).</cpp>

0

int __stdcall DoEEPROMWrite(uchar Address, uchar DataOutByte);
int __stdcall DoEEPROMRead(uchar Address, uchar * DataInByte);

Wywołanie :

char tmp_znak;                           // powinno być unsigned char lub uchar jeśli 
                                                 // jest zdefiniowane


_DoEEPROMRead(adres, &tmp_znak); // podajesz adres zmiennej operatorem '&'

Ale te funkcje przyjmują jako parametr typ unsigned char i wskaźnik do
unsigned char.
Może to mieć znaczenie ,więc uważaj co robisz .
Nie zgadzają się typy funkcji z programu i z biblioteki .


#include <vcl.h>
#pragma hdrstop

#include "main.h"
typedef unsigned char uchar ;
//---------------------------------------------------------------------------
extern "C" __declspec(dllimport) int DoEEPROMWrite(uchar Address, uchar DataOutByte);
extern "C" __declspec(dllimport) int DoEEPROMRead(uchar Address, uchar * DataInByte);
uchar tmp_znak;

.............
                //ZLE zdefiniowny wskaźnik do procedury powinno być:
..............  typedef  int (*aDoEEPROMRead)(uchar,uchar*); // !!!!
.............
0

Jakoś do tego doszedłem :) ..
Siedziałem całą noc i zrobiłem :D .. Dzięki za zainteresowanie.. czas coś zjeść :D

0

:-D
No to super jakbyś lukną wcześniej to może byś sie przespał pare godzin , smacznego , ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1