Fehler im Code

Hallo Leute,

Ein Freund hilft mit bei einer kleinen Spielerei, wozu ich gern eine .dll verwenden möchte.

Er hat den code so weit fertig, ob er tut, was er soll ist noch etwas unklar. Aber er lässt sich gar nicht kompilieren, da soll ein fehler bei der deklaration versteckt sein. Mehr verrät der Compiler nicht.

Kann mal jemand eine Blick darauf werfen?

Der DLL sollen die Pointer von drei Arrays übergeben werden, die Größe der arrays und ein Faktor der in jedem Durchlauf den Wert 0 bis 100 enthalten kann. Die ersten beiden Arrays sollen nur gelesen werden, das dritte soll verändert werden.

Gruß Rainer

[21:52:25] Stief: ----------------------------------------------------------
[21:52:26] Stief: //---------------------------------------------------------------------------

#include 
#include 
#pragma hdrstop
#if defined(\_MSC\_VER)
 #include 
 #define DLL\_export extern "C" \_\_declspec(dllexport)
#else
 #define DLL\_export
#endif



//---------------------------------------------------------------------------
// Important note about DLL memory management when your DLL uses the
// static version of the RunTime Library:
//
// If your DLL exports any functions that pass String objects (or structs/
// classes containing nested Strings) as parameter or function results,
// you will need to add the library MEMMGR.LIB to both the DLL project and
// any other projects that use the DLL. You will also need to use MEMMGR.LIB
// if any other projects which use the DLL will be performing new or delete
// operations on any non-TObject-derived classes which are exported from the
// DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
// EXE's to use the BORLNDMM.DLL as their memory manager. In these cases,
// the file BORLNDMM.DLL should be deployed along with your DLL.
//
// To avoid using BORLNDMM.DLL, pass string information using "char \*" or
// ShortString parameters.
//
// If your DLL uses the dynamic version of the RTL, you do not need to
// explicitly add MEMMGR.LIB as this will be done implicitly for you
//---------------------------------------------------------------------------

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void\* lpReserved)
{
DLL\_export void Sub\_Schleife (long\* PT1, long\* PT2, long\* PTReturn, long Cnt, int Faktor)
{
 unsigned char Pic1;
 unsigned char Pic2;
 unsigned char PicReturn;
 Pic1 = new unsigned char [Cnt];
 Pic2 = new unsigned char [Cnt];
 PicReturn = new unsigned char [Cnt];

 Pic1 = \*PT1;
 Pic2 = \*PT2;

 for(long i = 1; i 

Nachtrag - VB6 Code
Ach ja … In VB6 sieht das als Prozedur so aus wie unten. Das tut was es soll, aber zu langsam. :smile:

Private Sub Schleife(Pt1 As Long, Pt2 As Long, Pt3 As Long, \_
 Cnt As Long, Faktor As Integer)
 Dim i As Long
 For i = 1 To Cnt
 PicRes(i) = Pic2(i) / 100 \* Faktor + Pic1(i) / 100 \* \_
 (100 - Faktor)
 Next
 End Sub

Howdy,

Punkt 1: SubSchleife darf nicht in DllEntryPoint vereinbart
werden.

DLL_export void Sub_Schleife (long* PT1, long* PT2, long*
PTReturn, long Cnt, int Faktor)
{
unsigned char Pic1;
unsigned char Pic2;

Punkt 2: Pic1, Pic2 und PicReturn muessen unsigned char* sein, wenn denn hier ueberhaupt allokiert werden muss.

unsigned char PicReturn;
Pic1 = new unsigned char [Cnt];
Pic2 = new unsigned char [Cnt];
PicReturn = new unsigned char [Cnt];

Pic1 = *PT1;
Pic2 = *PT2;

Punkt 3: eine derartige Zuweisung funktioniert ueberhaupt nicht.
Hier muesste memcpy verwendet werden (was war denn die urspruengliche Intention des Statements?).

for(long i = 1; i

Gruss
norsemanna

Hi,

Private Sub Schleife(Pt1 As Long, Pt2 As Long, Pt3 As Long, _
Cnt As Long, Faktor As Integer)
Dim i As Long
For i = 1 To Cnt
PicRes(i) = Pic2(i) / 100 * Faktor + Pic1(i) / 100 * _
(100 - Faktor)
Next
End Sub

Dann wuerd ich jetzt erstmal davon ausgehen, dass die Signatur:

DLL\_export void Sub\_Schleife (long PT1, 
 long PT2, 
 long PT3, 
 long Cnt, 
 int Faktor)

ist und nicht

DLL\_export void Sub\_Schleife (long\* PT1, long\* PT2, long\* PTReturn, long Cnt, int Faktor)

Gruss
norsemanna

1 Like

Nachtrag: Re^2: Fehler im Code
Hi,

Der Punkt 5 sollte natuerlich

Punkt 5: das wuerde nur PTReturn (lokal) auf die Adresse einer anderen Variablen setzen. Den Wert, den PTReturn referenziert, spricht man mit *PTReturn an.

lauten.

Den Satz, der sagen sollte, dass die Rueckgabe einer Referenz auf eine lokale Variable spaeter mit Sicherheit zu einem Crash fuehrt, hatte ich schon gelöscht.

Gruss
norsemanna

Hallo,

ich bedanke mich!

Ich werde das so weiter geben.

Gruß Rainer

Hi,

Dann wuerd ich jetzt erstmal davon ausgehen, dass die
Signatur:

DLL_export void Sub_Schleife (long PT1,
long PT2,
long PT3,
long Cnt,
int Faktor)

ist und nicht

DLL_export void Sub_Schleife (long* PT1, long* PT2, long*
PTReturn, long Cnt, int Faktor)

Die Long, die da übergeben werden, sind Pointer. Trotzdem?

Ich hänge mal noch den vollständige Code des ganzen Projekts an. Das ist nicht viel und hilft eventuell, das richtig zu interpretieren.

Gruß Rainer

Option Explicit

Private Type BITMAP
 bmType As Long
 bmWidth As Long
 bmHeight As Long
 bmWidthBytes As Long
 bmPlanes As Integer
 bmBitsPixel As Integer
 bmBits As Long
End Type

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" \_
 (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, \_
 ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, \_
 ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Dim Cnt As Long, BytesPerLine As Long, PicInfo As BITMAP
Dim Pic1() As Byte, Pic2() As Byte, PicRes() As Byte

Private Sub Command1\_Click()
 Dim i As Integer, b As Long
 Me.Caption = "Start"
 DoEvents
 For i = 0 To 100 Step 5
 Schleife VarPtr(Pic1(1)), VarPtr(Pic2(1)), VarPtr(PicRes(1)), UBound(Pic1), i
 SetBitmapBits Picture1.Image, UBound(PicRes), PicRes(1)
 Picture1.Refresh
 Next
 Me.Caption = "Fertig"
End Sub

Private Sub Schleife(Pt1 As Long, Pt2 As Long, Pt3 As Long, \_
 Cnt As Long, Faktor As Integer)
 Dim i As Long
 For i = 1 To Cnt
 PicRes(i) = Pic2(i) / 100 \* Faktor + Pic1(i) / 100 \* \_
 (100 - Faktor)
 Next
 End Sub

Private Sub Form\_Load()
 Me.Show
 DoEvents
 GetObject Picture1.Image, Len(PicInfo), PicInfo
 BytesPerLine = (PicInfo.bmWidth \* 3 + 3) And &HFFFFFFFC
 ReDim PicRes(1 To BytesPerLine \* PicInfo.bmHeight \* 3) As Byte
 GetBitmapBits Picture1.Image, UBound(PicRes), PicRes(1)

 GetObject Picture2.Image, Len(PicInfo), PicInfo
 BytesPerLine = (PicInfo.bmWidth \* 3 + 3) And &HFFFFFFFC
 ReDim Pic1(1 To BytesPerLine \* PicInfo.bmHeight \* 3) As Byte
 GetBitmapBits Picture2.Image, UBound(Pic1), Pic1(1)

 GetObject Picture3.Image, Len(PicInfo), PicInfo
 BytesPerLine = (PicInfo.bmWidth \* 3 + 3) And &HFFFFFFFC
 ReDim Pic2(1 To BytesPerLine \* PicInfo.bmHeight \* 3) As Byte
 GetBitmapBits Picture3.Image, UBound(Pic2), Pic2(1)
End Sub

Neuer Versuch
Hallo,

Siehst Du Dir die neue Version bitte noch einmal an?
Alles was Du geschrieben hast, haben wir nicht verstanden, was er verstanden hat, hat mein Freund berücksichtigt.

//---------------------------------------------------------------------------
#include 
#include 
#pragma hdrstop
#if defined(\_MSC\_VER)
 #include 
 #define DLL\_export extern "C" \_\_declspec(dllexport)
#else
 #define DLL\_export
#endif

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void\* lpReserved)
{

DLL\_export int\* Sub\_Schleife ( long\* PT1, long\* PT2, long Cnt, int Faktor)
{
 unsigned char\* Pic1 = new unsigned char [Cnt];
 unsigned char\* Pic2 = new unsigned char [Cnt];
 unsigned char\* PicReturn = new unsigned char [Cnt];

 Pic1 = \*PT1;
 Pic2 = \*PT2;

 for(long i = 1; i 

Hi,

ich habe mich mal mit dem Kern des Problems befasst, und ich denke, ich war erfolgreich. Was ich da geschrieben habe ist mit Sicherjeit nicht optimal, vermutlich ist einiges sogar völlig falsch, aber das Ergebnis sieht aus, wie es soll, wenn ich die werte richtig interpretiere, die ich im Debugger sehe. Das muss nun noch in eine DLL …

Gruß Rainer

int Schleife ( char \*Ptr1, char \*Ptr2, char \*Ptr3, long Cnt, int Faktor)
 {
 char \*Pt1;
 char \*Pt2;
 char \*Pt3;
 char a;
 char b;
 char c;
 for ( long i = 0; i