kleinere Aufträge (DLL) gegen Bezahlung zu vergeben
-
Ich habe kleinere Auftragsarbeiten zu vergeben und suche Leute, die mit DLL-Programmierung und Anbindung an VBA und andere Systeme keine Probleme haben.
Wir haben derzeit kleinere finanzmathematische Projekte in Arbeit und können Mini-Projekte vergeben (natürlich gegen Entgeld).Vorab eine kleine Fleißaufgabe zum drüberschauen:
Das Program besteht aus 6 dateien:
3 Quelltext Dateien: demo.cpp; CArray.cpp und CZins.cpp
2 Header Dateien: CArray.h und CZins.h
1 Def Datei: demo.def// demo.cpp #include <string> // wegen function2 #include "CArray.h" //wegen function6 & function7 #include "CArray.cpp" //wegen function6 & function7 #include "CZins.h" //wegen function8 #include "CZins.cpp" //wegen function8 using namespace std; double __stdcall function1(long x, double y, long z) { double result; result = x + y*z + z*x + z + y + x*y ; return result; } double __stdcall function2(char x) { double result; if (x=='y') result =80; else result =30; return result; } double __stdcall function3(string x) { double result; if (x=="hallo") result =100; else result =50; return result; } double __stdcall function4(double myarray[8]) { long i; double summe=0; for(i=0; i<8; ++i) { summe += myarray[i]; } return summe; } double __stdcall function5(double kk, double daten[]) { long i; double summe =0; for (i=0; i < kk; ++i) { summe += daten[i]; } return summe; } double __stdcall function6(double x, CArray<double> mydata) { double summe=0; long i; for (i = 0; i< x; ++i) { summe = summe + mydata(i); } return summe*x ; } CArray<double> __stdcall function7(long x) { CArray<double> myarray; myarray.setSize(x); long i; for (i=0; i<x; ++i) { myarray(i) = i*4.0 ; } return myarray; } double __stdcall function8(double w, CZins myzins) { double result; if (myzins.stext=='y') result = 10 * myzins.x; else if (myzins.stext=='g') result = 6 * myzins.y + myzins.Kurve(3); else result = function6(w,myzins.Kurve); return result * w ; }
// CArray.h #ifndef CARRAY_H #define CARRAY_H template <class T> class CArray { public: // Constructors CArray () ; CArray ( long no_data ) ; // Copy CArray ( CArray<T>& matrixx ) ; // Zuweisung CArray<T>& operator = ( CArray<T>& matrixx ) ; // Destruktor ~CArray () ; // Methode void setSize ( long no_data ) ; // Operator T& operator () ( long i ) ; private: void copy ( CArray<T>& matrixx ) ; // Instanzvariablen long* capacity ; T* contents ; }; #endif
//CArray.cpp #include "CArray.h" template <class T> CArray<T> :: CArray () { capacity = 0 ; contents = 0 ; } template <class T> CArray<T> :: CArray ( long no_data ) { setSize ( no_data ) ; } template <class T> CArray<T> :: CArray ( CArray<T>& matrixx ) { this -> copy ( matrixx ) ; } template <class T> CArray<T> :: ~CArray () { delete [] capacity ; delete [] contents ; } template <class T> CArray<T>& CArray<T> :: operator = ( CArray<T>& matrixx ) { if ( this == &matrixx ) { return *this ; } delete [] capacity ; delete [] contents ; this -> copy ( matrixx ) ; return *this ; } template <class T> void CArray<T> :: copy ( CArray<T>& matrixx ) { long i; capacity = new long [1]; long totalSize = 1 ; totalSize = matrixx.capacity [ 0 ] ; capacity[0]=matrixx.capacity [ 0 ] ; contents = new T [ totalSize ] ; for ( i = 0 ; i < totalSize ; i++ ) { contents [ i ] = matrixx.contents [ i ] ; } } template <class T> void CArray<T> :: setSize ( long no_data ) { capacity = new long [ 1 ] ; capacity [ 0 ] = no_data ; contents = new T [ no_data ] ; } template <class T> T& CArray<T> :: operator () ( long i ) { return contents [ i ] ; }
//CZins.h #include "CArray.h" //wegen function8 #ifndef CZINS_H #define CZINS_H class CZins { public: double x; double y; char stext; CArray<double> Kurve; //Konstruktor CZins ( ); }; #endif
//CZins.cpp #include "CZins.h" CZins :: CZins () { x = 0 ; y = 0 ; stext='y'; }
//demo.def LIBRARY Mydemo EXPORTS function1 @1 function2 @2 function3 @3 function4 @4 function5 @5 function6 @6 function7 @7 function8 @8
Die Funktionen sollten simple Zahlen, -String und Array Operationen durchführen...
In VBA sind sie folgendermaßen angebunden:
'in Visual Basic:
Option Explicit Declare Function function1 Lib _ "D:\Pfad\Demo.dll" _ (ByVal x As Long, ByVal y As Double, ByVal z As Long) As Double 'funktioniert!!! Declare Function function2 Lib _ "D:\Pfad\Demo.dll" _ (ByVal x As String) As Double 'fehlerhaft: gibt immer 30 zurück!!! WARUM????????
'bei function3 bis function8 erzeugt es einen Excel-Absturz???
Bei Fragen kann gerne auch unter Tel.: 03302/208750 Kontakt aufgenommen werden.
-
So einfach geht das ganze nicht. Da musst Du Variant-Typen verwenden. Wie das - mehr oder weniger gut - funktioniert, weiss ich aber nur für Delphi.
Für string sollte eigentlich wchar_t gehen. Strings sind in VB immer Multibyte-Strings (auch unter Win9x).
Für eigene Klassen musst Du wahrscheinlich Adapterklassen erstellen, die entweder IUnknown oder IDispatch implementieren (was VBA genau unterstützt weiß ich nicht, mit IDispatch bist Du aber der sicheren Seite, ist dafür aber anspruchsvoller).Also am besten ist, wenn Du das als eine ActiveX-Bibliothek und nicht als einfache DLL implementierst. Aber wie gesagt kann ich dir da leider nicht weiterhelfen.
-
Im Grunde hast du Recht. Man kann nur die Datentypen verwenden die dafür vorgesehen sind.
z.B. ein BSTR
Ich habe aber auch Tel. Es geht nicht nur um VB/VBA sondern auch um DLL/so unter Windows/Linux u.s.w. Also im Grunde Library-Entwicklung für den Finanzbereich.
-
Da gerade Urlaubszeit ist, kann ich nicht gleich auf eure Angebote reagieren.
Wir müssen unsere "Problemchen" erst mal sammeln, dann trete ich noch mal an euch heran...
Auf jedenfall erst mal Danke für's drüberschauen.quansol
-
double __stdcall function1(long x, double y, long z) VB: Declare Funktion function1 lib "deinedll.dll" (byval x as long, byval y as double, byval z as long) as double
double __stdcall function2(char x) VB: Declare Dunction function2 lib "deinedll.dll" (byval x as byte) as double
double __stdcall function3(string x)
- mit string lässt sich in vb(a) nix anfangen, nur native datentypen(long, double etc.) und Arrays
von diesen lassen sich von VB an externe Funktionen übergeben und dürfen als rückgabewerte verwendet werden
-> benutzte stattdessen char*double __stdcall function3(char* x) VB: Declare Funtion function3 lib "deinedll.dll" (byval x as string) as double
double __stdcall function4(double myarray[8]) VB: Declare function function4 lib "deinedll.dll" ( byref myarray as double) as double
byref myarray muss das erste elemente eines VB-Double-arrays sein, z.B.
dim x(7) as double() ret = function4( x(0))
double __stdcall function5(double kk, double daten[]) VB: Declare function function5 (byval kk as double, byref daten as double ) as double
Aufruf: siehe Beispiel oben
double __stdcall function6(double x, CArray<double> mydata)
-> für CArray gilt das selbe wie für alle andere nicht nativen datentypen, s.o stattdessen double[] und
längendescriptor benutzendouble __stdcall function6(double x, double mydata[], long mydatasize)
CArray<double> __stdcall function7(long x)
s.o ,stattdessen double* + längendescriptor an VB als Referenz übergeben!
void __stdcall function7(long x, long* arraysize, double* retarray ) VB: Declare function function7 lib "deinedll.dll" ( byval x as long, byref arraysize as long, byref retarray as double )
double __stdcall function8(double w, CZins myzins)
-> CZins, selber Fall wie string und CArray -> eventuell nachbilden mit mehreren nativen datentypen
-
Nachtrag:
Wenn unbedingt mehr als native Datentypen benötigt wird, dann COM benutzen.