Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Parameterübergabe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.01.2004, 11:10 Uhr
MasterThomsen



Wie kann ich statt einen long-Wert (wie im Bsp. unten) nur von einer DLL an eine EXE zurückzugeben ein long-Array von einer EXE an eine DLL und wieder zurück an die EXE übergeben?

extern "C" __declspec(dllexport) long BasicClockDLLDlg()

Kann mir da einer von euch weiterhelfen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.01.2004, 11:15 Uhr
typecast
aka loddab
(Operator)


->
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.01.2004, 11:47 Uhr
MasterThomsen



Wohin?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.01.2004, 11:49 Uhr
typecast
aka loddab
(Operator)


WinAPI, ist nämlich kein ANSI C/C++.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.01.2004, 12:59 Uhr
virtual
Sexiest Bit alive
(Operator)


Naja, das mit der DLL spielt eigentlich keine Rolle: Du willst einfach ein Array an eine Funktion übergeben, dort bearbeiten und dann zurückliefern, denke ich:

C++:
void func(long* array, size_t array_size)
{
  ... Mach was mit array
}
...
long x[100];
func(x, sizeof(x)/sizeof(*x)); // Wenn statisch def. Array

long* y = malloc(100*sizeof(long));
func(y, 100); // Wenn dynamisch def. Array



Daß func möglichweise in einer DLL liegt, sollte unerheblich sein.
Sollte die Arraygröße beaknnt sein in func (weil die übergebenen Arrays immer die gleiche Größe haben), kannst du natürlich den zweiten Parameter auch fortlassen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.01.2004, 13:01 Uhr
RHBaum



Aber die DLLs nutzen eine C Schnitstelle ... also waere die frage aequivalent zu:
Wie gebe ich unter C als Rueckgabewert einer Funktion ein Long-Array zurueck ?

Antwort:
Zeig mal deine Finger her und gib mit mal den Rohrstock da ...:p

Im ernst ... Arrays sind eine komplexe geschichte, und grade bei solchen Anwendungsfaellen nen stolperstein ...

was wissen wir von arrays ?

- die variable repraesentiert eigentlich die Adresse des 1. wertes im array.
- Arrays koennen statisch oder dynamisch erzeugt werden.

Weiter gibts noch paar richtlinien :
- Erzeuge Dynamische Variablen immer so weit wie moglich am ort des geschehens
- erzeuge dynamsiche variablen aber auch so, das sie dort zertsoerst, wo du sie auch erzeugst. Also in der gleichen funktion / methode, oder im konstruktor/Destruktor der selben klasse (fuer c ist nur 1.tes relevant.)

Daraus leiten wir ab:
um arrays zu spezifizieren hab ich 3 Paarmeter. den typ, die startadresse die groesse. Die krieg ich aber nur in 2. variablen, parameter unter, als zeiger auf typ (fuer adresse und typ) und groesse.
deshalb ... ist ein array als reuckgabetyp eher ungeeignet.
Schau dir die WinAPI an, da wirst sowas auch nie finden ...

Wie macht man nun sowas ?

DIe winapi deklariert funktionen der art meist so

int myfunc(long * pdata,int buffersize, int * size);

Rueckgabe ist nen Fehlerindikator
pdata, ist zeiger auf das Array,
buffersize ist die groesse des arrays
size ist die anzahl der elemente, die die funktion wirklich reingeschrieben hat.

Wichtig, die funktion allociert keinen speicher, das solltest selbst machen.

Um den benoetigten speicher im voraus berechnen zu koennen, und nicht auf verdacht endlos viel speicher zu allokieren, unterstuetzen manche funktionen 2 modi.
im 2. modi gibst als pdata NULL (0) an, und als buffersize auch, dann gibt dir die funktion in size die benoetigte groesse des arrays zurueck ...

aussehen tut das dann folgendermassen
statisch:

C++:
long data[500];
int valuecount;
int ireturn = myfunc(data,500,&valuecount);


dynamisch:

C++:
int array_size;
int ireturn = myfunc(0,0,&array_size);
long * data =(long *) malloc(array_size * sizeof(long));
int valuecount;
ireturn = myfunc(data,array_size ,&valuecount);



Natuerlich fehlen noch ne menge code um fehler abzufangen, rueckgabewert und den wert in size solltest auf alle checken ...

Hoffe das hilft ....

CIao

Dieser Post wurde am 15.01.2004 um 13:07 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: