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 ?
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)
Hallo, "The MATLAB® shared library interface supports C library routines only" Kann es vielleicht sein, dass Matlab hier keine C++-DLLs akzeptiert?
EDIT: Ich meinte keine C++ Klassen oder überladene Funktionen, die eventuell in der DLL stehen könnten.
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
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
Hallo, also gut. Ich werde mal das probieren, was Frank Link geschrieben hat. Mal schauen was rauskommt. Ich melde mich diesbezüglich.
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
:
Bearbeitet durch User
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 :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.