DLL mir C schreiben. Wie beginne ich?

Hi

Mein Problem ist das ich eine DLL schreiben will die ich dann in LabView verwenden kann. Diese DLL möchte ich gerne in LabWindows/CVI schreiben.
Diese DLL erhät drei Arrays als Eingang und gibt ein Array aus.
Die Berechungnen in der DLL sind für mich nicht das Problem.
Mein Problem ist das ich nicht weiß wie der Code ausschauen soll für die Eingänge und die Ausgänge.
Ich hoffe ich habe micht verständlich genugn ausgedrückt.

Danke für die Hilfe.

Mfg Stefan

Hallo Stefan,

arrays kannst du sowieso nur als Pointer übergeben. Dabei sollte man die Speicherverwaltung auf einer Seite der Schnittstelle belassen, damit es nicht zu unübersichtlich wird - damit meine ich, das Hauptprogramm sollte auch den Speicher für das Ausgabearray reservieren und freigeben. Dann übergibst du 4 Pointer als Parameter.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

mittels einem C-Compiler wie z.B. Visual Studio kannst du dir ein DLL-Projekt generieren lassen. Bei VS gibt es einen Eintrag fuer neue Projekt „Win32 Dynamic Link Library“, dort wir dir das benoetigte Geruesst und die Compileroptionen entsprechend eingestellt, und die brauchst das ganze nur noch mit Leben zu fuellen.

Die nach aussen „sichtbaren“ Funktionen werden mittels

type WINAPI funktionsname ( parameter) deklariert

WINAPI ist ein define in der WINDEF.H und ist das gleiche wie CALLBACK oder __stdcall.

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi

Kann mir jemand ein kleines Beispiel geben wie der Code ausschauen muss damit ich daraus dann eine Dll erstellen kann?
Vielleicht mit 2 Arrays als EIngang dann eine kleine Rechenoperation und dann ein Array als Ausgang.

Danke für eure Hilfe

Mfg Stefan

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Stefan!

Ich stand vor gut 3Monaten vor dem gleichen Problem, nur das ich die Dll nicht in CVI schreiben wollte. Aber in C/C++ geht es, unter beachtung kleinerer Sachen recht einfach.

Ich weiß ja nicht, was du für Arrays übergeben willst, aber ich mach es immer so, dass ich die einzelnen Variablen als Pointer To Value übergebe und die Strings als U8-Array (unsigned char*).

Somit kannst du dein headerfile(z.B: dll.h) so beginnen:

#include

extern „C“{
int __declspec(dllexport) __stdcall Funktion(char*, int*);
}

Dein Sourcecode wäre dann, insofern du deiner dll einen Text erzeugst:

#include „dll.h“

BOOL __stdcall DllMain( HANDLE H_Module,
DWORD DW_ReasFCall,
LPVOID LP_Reserved
)
{
switch(DW_ReasFCall)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

int __declspec(dllexport) __stdcall Funktion(char* Buffer, int* Zahl)
{
// Zahl kannst einfach beschreiben:
*Zahl = 5;

//String übergabe machste am besten über memcpy
std::string String;
String.append(„Hallo“);
memcpy(Buffer, String.data(), String.length());

return 0;
}

Die Funktion bindeste einfach über das CallLibraryFunction.vi ein, und dann sollte das funzen. Du musst aber aufpassen, dass du aus LabVIEW genug Speicher allokierst. Dass heißt, du darfst dein U8-Array nicht mit Länge Null initialisieren, dann hagelts Exceptions.

Na denn. Ich hoffe es hilft.
Stefan.

Hi

Danke für den Code er hat mich schon weitergebracht. Da ich es aber trotzdem in CVI probieren möchte habe ich noch eine Frage.
Das Schlüsselwort extern kenne ich noch nicht und ich habe in der Hilfe zwar rausgefunden was es bedeutet aber der CVI Compiler mag das „C“ danach nicht. Für was ist dieses „C“?
Danke für die Antwort.

Mfg Stefan

Hallo Stefan,

Das Schlüsselwort extern kenne ich noch nicht und ich habe in

der Hilfe zwar rausgefunden was es bedeutet aber der CVI
Compiler mag das „C“ danach nicht. Für was ist dieses „C“?

extern „C“{
}

Benötigst du nur, wenn du das Programm in C++ schreibst.
Wenn du das Programm in C chreibst musst du das weglassen, aber das zwischen ‚{‘ und ‚}‘ musst du stehen lassen.

MfG Peter(TOO)