DLL in Matlab

Gast #5071799
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!
Gast #5071944
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 ?
Gast #5071951
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)
Persönliche Seite #5072040
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.
(Firma: Flk Consulting UG) #5072145
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
(Firma: Flk Consulting UG) #5075739
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
Gast #5076194
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren