Forum: PC-Programmierung DLL in Matlab


von Mixer007 (Gast)


Lesenswert?

Hallo liebes Forum,

Ich habe hier eine DLL-Datei von welcher ich gerne Funktionen für ein 
Matlab-Skript verwenden würde.
Nur leider kriege ich es nicht hin, die DLL zu laden.

Skript sieht folgendermaßen aus:

if libisloaded('DisplayImg')
    Success = 1;
else
    Success = 0;
    % Looking for the necessary files.
    path(path,'C:\Programme\edevis\DisplayImgVI\');
    if exist('DisplayImg.dll','file')==0 || 
exist('DisplayImg.h','file')==0
        error(['Please copy all DisplayImg.dll and DisplayImg.h to the 
same folder as "DisplayImg.exe" (usually "C:\Program 
Files\edevis\DisplayImgVI\").']);
    end;
    % Loading the library.
    disp('Loading DisplayImg.dll ...')
    [notfound, warnings]=loadlibrary('DisplayImg', 'DisplayImg.h');
    if libisloaded('DisplayImg')
        Success = 1;
    end;
end

und bekomme nun folgenden Fehlermeldungen( sind ganz, ganz viele) :

ein paar Typen von denen hier:
Function pointer types are unsupported in structures  HRESULT ( * 
QueryInterface )( ILayoutStorage * .
Found on line 44385 of input from line 13358 of file 
C:/ProgramData/MATLAB/SupportPackages/R2017a/MW_MinGW_4_9/x86_64-w64-min 
gw32/include/objidl.h

dann solche hier:

Type 'LARGE_INTEGER' was not found.  Defaulting to type error.

Found on line 59792 of input from line 241 of file 
C:/ProgramData/MATLAB/SupportPackages/R2017a/MW_MinGW_4_9/x86_64-w64-min 
gw32/include/winioctl.h


und sowas:

Failed to parse type '( _cdecl_ )) DI_GetCameraCount ( PINT32 count' 
original input '( _cdecl_ )) DI_GetCameraCount ( PINT32 count '
Found on line 63519 of input from line 92 of file 
C:\\Programme\\edevis\\DisplayImgVI\\DisplayImg.h
Error parsing argument for function _attribute_ function may be 
invalid.

und schließlich:

Error using loadlibrary
Building DisplayImg_thunk_pcwin64 failed.  Compiler output is:
C:\ProgramData\MATLAB\SupportPackages\R2017a\MW_MinGW_4_9\bin\gcc 
-I"C:\Program
Files\MATLAB\R2017a\extern\include" -fexceptions -fno-omit-frame-pointer
-I"C:\Users\Thermo\Desktop" -I"C:\Programme\edevis\DisplayImgVI"
"DisplayImg_thunk_pcwin64.c" -o "DisplayImg_thunk_pcwin64.dll" -shared
DisplayImg_thunk_pcwin64.c: In function 'int32':
DisplayImg_thunk_pcwin64.c:33:41: error: expected declaration specifiers 
before
')' token
 EXPORT_EXTERN_C int32_T 
int32(_cdecl_))DI_Initialize(LPCWSTRpathThunk(void
 fcn(),const char *callstack,int stacksize)

DisplayImg_thunk_pcwin64.c:5:26: error: expected declaration specifiers 
before
'__attribute__'
   #define DLL_EXPORT_SYM __declspec(dllexport)
                          ^
DisplayImg_thunk_pcwin64.c:19:25: note: in expansion of macro 
'DLL_EXPORT_SYM'
 #define EXPORT_EXTERN_C DLL_EXPORT_SYM.


Das sind ganz schön viele Fehlermeldungen. Was stimmt hier bloß nicht?
Ich habe die DLL-Datei nicht geschrieben weder die header-Datei.
Ich habe die Info, dass die DLL- Datei in C++ geschrieben ist. Kann 
Matlab C++-Dlls einbinden? Ich glaube nicht, dass irgendwas falsch ist 
am Skript.
Sitze nun schon seit zwei Wochen dran und komme kein Stück weiter.

Ich freue mich über jede Art von Hilfe!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Deine DLL scheint COM-Automation zu verwenden. So etwas wird nicht per 
LoadLibrary eingebunden, sondern über die Windows-Automationsmechanismen 
(ActiveX, (D)COM) etc. angesprochen.

Ob Matlab das unterstützt, entzieht sich meiner Kenntnis.

von Mixer007 (Gast)


Lesenswert?

Hallo,

Könntest du das bitte ausführlicher erläutern. Für mich sind 
COM-Automation und ActiveX und (D) COM nämlich Neuwörter.

Ok, gibt es denn die Möglichkeit das Ganze auch per C/C++ Code 
einzubinden.
Also, ist sowas möglich? Würd mich einfach gern interessieren.
Also ich mein jetzt die Funktion aus der DLL-Datei in einem C/C++ Code 
zu verwenden ?

von Matlabritis (Gast)


Lesenswert?

Die Antwort auf die Fehlermeldung:

"Function pointer types are unsupported in structures "

könnte sein:

"Limitations Using Pointers
Function Pointers

The shared library interface does not support library functions that 
work with function pointers."

(https://de.mathworks.com/help/matlab/matlab_external/limitations-to-shared-library-support.html?requestedDomain=www.mathworks.com)

von Mixer007 (Gast)


Lesenswert?

Hallo,

"The MATLAB® shared library interface supports C library routines only"

Kann es vielleicht sein, dass Matlab hier keine C++-DLLs akzeptiert?

von Mixer007 (Gast)


Lesenswert?

EDIT: Ich meinte keine C++ Klassen oder überladene Funktionen, die 
eventuell in der DLL stehen könnten.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mixer007 schrieb:
> Für mich sind COM-Automation und ActiveX und (D) COM nämlich Neuwörter.

Da wirst Du Dich in die einschlägige Literatur einlesen müssen.

https://msdn.microsoft.com/de-de/library/windows/desktop/ff486375(v=vs.85).aspx



Automation ist ein Mechanismus zur Interprozesskommunikation, mit dem 
u.a. Programme wie das Office-Paket von anderen Anwendungen gesteuert 
werden können. Damit ist es auch möglich, einen Teil der Oberfläche des 
gesteuerten Programmes in ein eigenes Programm einzubinden (ein Beispiel 
ist die Integration des Acrobat Readers als PDF-Anzeiger in den Internet 
Explorer).

Dieser Mechanismus wurde zusammen mit OLE (object linking and embedding) 
schon im vergangenen Jahrhundert entwickelt, so konnten in 
Office-Programmen auch die Daten anderer OLE-fähiger Anwendungen 
eingebunden und angezeigt werden.

Anstelle eines kompletten Programmes kann auch eine DLL die gleichen 
Steuerungfunktionen zur Verfügung stellen; dem Nutzer der Funktionen 
fällt der Unterschied nicht sofort auf.

(Stichworte hierfür sind "in-process server" vs. "out-of-process 
server")

> Ok, gibt es denn die Möglichkeit das Ganze auch per C/C++ Code
> einzubinden.

Prinzipiell ja, aber die Programmierschnittstellen dafür sind hochgradig 
eklig, ihr Gebrauch wirr und kryptisch, und das Debuggen wird einem sehr 
schwer gemacht.

Der Gebrauch von COM-Schnittstellen (nicht zu verwecheln mit seriellen 
Schnittstellen, COM steht für "common object model") ist mit anderen 
Programmiersprachen wie VB, VBA, VBScript und natürlich dem 
.Net-Geraffel hingegen recht einfach.
1
dim WRD
2
3
set WRD = CreateObject("Word.Application")
4
5
WRD.Application.StatusBar = "Huhu!"

Das als *.vbs abgespeichert, ruft ein auf Deinem Rechner installiertes 
MS Word auf und schreibt Text in dessen Statuszeile.

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo,
wie Rufus schon schreibt könnte es sich um eine ActiveX DLL handeln.

Um es zu testen versuch mal die DLL zu registrieren. Wie das gemacht 
wird steht hier:

https://msdn.microsoft.com/de-de/library/bb978981.aspx

Die Registrierung der DLL sollte in dem Verzeichnis erfolgen, in dem sie 
später auch liegen soll. Wenn Du sie verschiebst, muss Du sie neu 
registrieren.

Wenn sie sich registrieren lässt, findest Du hier ein Beispiel wie man 
in MathLab ActiveX Container verwendet.

http://www.ultimaserial.com/matlab.html

Lass Dich nicht davon verwirren, dass es sich in dem Beispiel um eine 
visuelle Komponente handelt. ActiveX geht auch für nicht visuelle 
Klassen.

Vorausgesetzt, es ist eine ActiveX DLL, kannst Du den Namen des Com- 
Containers über die Windows Registry ermitteln. Suche mit RegEdit nach 
dem Namen der DLL.

Gruß
Frank

von physiker (Gast)


Lesenswert?

Wie hier schon geschrieben wurde unterstützt MATLAB nur das laden von 
DLLs mit C-Interface:
https://ch.mathworks.com/help/matlab/ref/loadlibrary.html

Wenn man das nicht hat, muss man üblicherweise einen Wrapper schreiben.

Aber MATLAB unterstützt auch COM direkt:

https://ch.mathworks.com/help/matlab/using-com-objects-in-matlab.html

von Mixer007 (Gast)


Lesenswert?

Hallo,

also gut. Ich werde mal das probieren, was Frank Link geschrieben hat.
Mal schauen was rauskommt. Ich melde mich diesbezüglich.

von Mixer007 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

also ich habe versucht die DLL zu registrieren. Bekomme aber die 
folgende Fehlermeldung.( hab ich als Anhang hinzugefügt).

Ist vielleicht die DLL-Datei hier Schrott, oder bin ich bloß zu blöd um 
es zum Laufen zu bringen?

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo,
nein, die Fehlermeldung ist korrekt. Sie sagt lediglich aus, dass diese 
DLL kein ActiveX Container ist.

Du wirst die DLL also nicht so einfach in MatLab verwenden können.

Wenn Du die Sourcen zur Verfügung hast, wirst Du Dich damit beschäftigen 
müssen. Wenn nicht, bleibt Dir nichts anderes übrig, als einen C Wrapper 
zu schreiben, der Dir die Verwendung ermöglicht.

Gruß
Frank

: Bearbeitet durch User
von Felix U. (ubfx)


Lesenswert?

Nur mal als Anmerkung: Die Herstellerfirma wirbt mit Matlab Support. 
Wenn du dich an die wendest, wirst du ziemlich sicher eine ready-to-use 
DLL für Matlab kriegen

von Mixer007 (Gast)


Lesenswert?

Hallo,

ja das Problem hat sich von selbst gelöst.
Ich habe einfach eine ältere Version von Matlab installiert als auch 
Visual Studio. In dem Fall war es Matlab 2012b und Visual Studio 2010 
Ultimate.
Und dann hat es getan :). Wobei ich nicht ganz verstehe warum, was meint 
ihr?  Glaubt ihr, dass man nun in diesem Fall dasgleiche auch auf Matlab 
2017a realisieren kann. Also das Laden der DLL?
Ich bin selbst Student und beschäftige mich im Rahmen einer 
Studienarbeit mit Matlab für diese Firma :)

von Mixer007 (Gast)


Lesenswert?

Naja trotzdem will ich mich bei euch für die Hilfe bedanken!!!

Ein großes Danke Schön!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.