eine dll in ein TImage zeichenn lassen
-
also ich habe jetzt mehrere visualisierungen für meinen mp3 player programmiert. diese wollte ich jetzt (jede einzeln) in eine dll packen. und die dann im mp3 player darauf zugreifen. Die visualisierungen zeichnen in ein TImage auf dem Hauptformular. Ich weiss jetzt nicht, wie ich das ganze verwirklichen soll. kann mir irgendjemans dabei helfen?
-
Hi,
dlls sind doch auch eigentlich nur Funktionen. Am besten einfach das Canvas von Image an eine Funktion übergeben und dann darauf zeichnen....MfG
Alexander Sulfrian
-
ja, stimmt. das hab ich jetzt gemacht.
Aber ich werde aus der FAQ zum thema dll einginden nicht schlau
meine funktion:void Vis1(TCanvas *canvas, float *spec, TColor col) { canvas->Pen->Color = col; for(int i = 0; i < 512; i++) { canvas->MoveTo(i, 300); canvas->LineTo(i, 300 - (spec[i]*300)); } }Die soll in die dll.
Das habe ich gemacht. muss ich das dann noch extra exprotieren?
und wie rufe ich die funktion von meinem programm aus auf?
bis jetzt bin ich sowiet:*.cpp file:
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { HINSTANCE hInstance; hInstance = ::LoadLibrary("vis1.dll"); pDllFunction = (DLLFUNCTION*)::GetProcAddress((HMODULE)hInstance, "vis1"); } //--------------------------------------------------------------------------- ... (*pDllFunction)("Image1->Canvas","*spectrum","color[zufall]");header file:
typedef int (DLLFUNCTION)(TCanvas, float*, TColor); DLLFUNCTION *pDllFunction;aber es funktioniert nicht.
-
Schau mal, ob Dir das hier weiterhilft:
http://home.snafu.de/christian.marquardt/tutorials.8/8_dll.html
Wenn ich hier so einfach auf fremde Seiten verlinken darf... Bin mir aber sicher, Christian hat nichts dagegen.
Grüße
-
ich habe mir das jetzt angeschaut, aber ich bekomme immernoch eine zugriffsverletzung.
mein quelltext:void (__stdcall* visit)(TCanvas*, float*, TColor); float *spectrum[512]; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { HINSTANCE hdll=LoadLibrary("Project2.dll"); visit=(void(__stdcall*)(TCanvas*, float*, TColor))GetProcAddress(hdll,"_visit"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { visit(Image1->Canvas, *spectrum, clAqua); } //---------------------------------------------------------------------------in der dll:
void Vis1(TCanvas *canvas, float *spec, TColor col) { canvas->Pen->Color = col; for(int i = 0; i < 512; i++) { canvas->MoveTo(i, 300); canvas->LineTo(i, 300 - (spec[i]*300)); } }
-
float *spectrum[512]; // muß das nicht float* spectrum = new float[512]; heißen? visit(Image1->Canvas, *spectrum, clAqua); // muss das nicht (Image1->Canvas, spectrum, clAqua); heißen?
-
visit(Image1->Canvas, *spectrum, clAqua);[C++ Fehler] Unit1.cpp(24): E2034 Konvertierung von 'float * *' nach 'float *' nicht möglich
-
float *spectrum[512]; float* spectrum = new float[512]; // meiner Meinung nach visit(Image1->Canvas, *spectrum, clAqua); visit(Image1->Canvas, spectrum, clAqua); // den Zeiger übergeben, nicht die Werte (so wie beim Canvas auch)