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!
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.
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 ?
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.
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
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?
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
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
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 :)