PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Aufruf von C++ - Dll mit VB-hDC als Parameter



KL47
19-07-2004, 13:12
Der Gerätekontext (hDC) wird in VB als 'Long' zurückgegeben, in C++ wird aber eine Klasse CDC erwartet.

Meine Frage ist also: Wie kann ich den Long in CDC umwandeln?

Im Prinzip will ich die GUI mit Visual Basic programmieren, einen Teil davon aber in eine C++ - DLL auslagern, ich erstelle also eine PictureBox und will die DLL dann in diese PictureBox zeichnen lassen.
Wenn man sich die Win-APIs wie z.B. 'StretchBlt' aus "gdi32" anschaut, sieht man, dass es anscheinend geht, wie genau weiß ich aber nicht.

Vielen Dank für Vorschläge, Ideen und Alternativen. :)

anda_skoa
19-07-2004, 17:10
Ich schätze mal, du kannst das Window Handle einfach casten, womöglich hat der CDC sogar einen Construktor, der ein Window Handle nimmt.

Ein C++ DLL unter VB zu benutzen dürfte ein Standardproblem sein -> steht sicher in der MSDN.

Ciao,
_

KL47
19-07-2004, 18:41
Hm, aber wie das geht weißt du nicht? Also eine DLL einbinden und ne Funktion in der DLL aufzurufen ist kein Problem nur weiß ich eben nicht wie das mit dem Umwandeln funktioniert, in der MSDN hab ich zu CDC nichts gefunden...

anda_skoa
19-07-2004, 19:20
Ich arbeite unter Windows auch nur mit Qt :)

CDC dürfte eine MFC Klasse sein. Da MFC nur ein WinAPI Wrapper ist und ein HWnd ein typischer WinAPI Typ ist, ist es sicher nicht so schwierig.

Nach ein bischen Googlen würde ich sagen probier es mal mit CDC::Attach
http://www.cppdoc.com/example/mfc/classdoc/MFC/CDC.html

Ciao,
_

KL47
19-07-2004, 20:51
Hm, also Attach erwartet aber schon als Parameter nen HDC und kein Long... Das Problem ist eben, dass ich nur diese Zahl habe und die dann in nen HDC umwandeln muss... :(

Achso, also das cppdoc.com kannt ich noch nicht, das ist schonmal sehr praktisch... :)

KL47
20-07-2004, 08:03
Also ich glaube, dass das Übergeben vom CDC als Parameter funktioniert, nur zeichnet der leider immer noch nicht :(



// Also das steht bei mir in der DLL drin

extern "C" int PASCAL EXPORT draw (CDC *dc)
{
CDC hdc;

hdc.CreateCompatibleDC(dc);


CPen lPen(PS_SOLID, 1, RGB(0, 255, 0));

hdc.SelectObject(&lPen);

hdc.MoveTo(1,1);
hdc.LineTo(1000,1000);

return 0;
}





' Das ist im VB-Projekt drin

Private Declare Function draw Lib "MyDll.dll" (hDc As Long) As Integer

Private Sub Form_Click()

Me.Caption = draw(Me.hDc)

End Sub



Soo, und wenn ich jetzt in der DLL z.B. 'AfxMessageBox' aufrufe, die DLL erstelle und dann im VB-Programm auf die Form klicke wird die Box auch angezeigt. Im Titel der Form steht dann auch immer '0' (oder was immer ich auch bei der DLL als return-Wert angebe). Der Aufruf funktioniert also.
So, das hDc wird auch irgendwie akzeptiert, weil wenn ich statt 'Me.hDc' einfach '0' übergebe, stürzt mein VB-Programm ab, ansonsten läufts, das einzige Problem ;) ist einfach nur, dass der nicht zeichnet... :mad:

~ edit ~
Also wenn ich

if (hdc.LineTo(1000, 1000)) return 0;
else return 1;

in die DLL schreibe wird auch immer '0' zurückgegeben...

anda_skoa
20-07-2004, 08:27
Hm, also Attach erwartet aber schon als Parameter nen HDC und kein Long... Das Problem ist eben, dass ich nur diese Zahl habe und die dann in nen HDC umwandeln muss... :(


Das ist wahrscheinlich nur ein typedef.

Probier mal einen cast von long aud HDC
HDC hdc = (HDC) der_long_parameter

Ciao,
_

KL47
20-07-2004, 10:28
Ne, Cast will er nicht, gibts keinen Konstruktor für. :-/

Die Klasse ist übrigens CDC, nicht HDC, hab mich geirrt...

anda_skoa
20-07-2004, 10:44
Die Klasse ist übrigens CDC, nicht HDC, hab mich geirrt...

CDC ist die Klasse, aber HDC könnte das DC Handle sein, dessen long Form du hast.
Siehe Attach

Ciao,
_

KL47
20-07-2004, 11:15
JAAA! Juhuu!!! :)

Also, Code im VB-Modul bleibt so wie er is und in der DLL siehts dann so aus:



extern "C" int PASCAL EXPORT draw(HDC *dc)
{
CDC hdc;

hdc.Attach(*dc);


CPen lPen(PS_SOLID, 1, RGB(0, 255, 0));

hdc.SelectObject(lPen);

hdc.MoveTo(1,1);

if (hdc.LineTo(1000, 1000)) return 0;
else return 1;
}


Vielen Dank, hast mir sehr geholfen! :)