Отговорът е да се изгради указател към c-низ с помощта на LIBPOINTER функционира като @JonasHeidelberg предложено. Нека разширя неговото решение с работещ пример.
Първо нека изградим проста DLL:
версия.h
#ifndef VERSION_H
#define VERSION_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _WIN32
# ifdef BUILDING_DLL
# define DLL_IMPORT_EXPORT __declspec(dllexport)
# else
# define DLL_IMPORT_EXPORT __declspec(dllimport)
# endif
#else
# define DLL_IMPORT_EXPORT
#endif
DLL_IMPORT_EXPORT void myGetVersion(char**str);
#ifdef __cplusplus
}
#endif
#endif
версия.c
#include "version.h"
#include <string.h>
DLL_IMPORT_EXPORT void myGetVersion(char **str)
{
*str = strdup("1.0.0");
}
Можете да използвате предпочитания от вас компилатор за изграждане на DLL библиотеката (Visual Studio, MinGW GCC, ..). Използвам MinGW, за да компилирам горното, ето make-файла, който използвам:
Makefile
CC = gcc
all: main
libversion.dll: version.c
$(CC) -DBUILDING_DLL version.c -I. -shared -o libversion.dll
main: libversion.dll main.c
$(CC) main.c -o main -L. -lversion
clean:
rm -rf *.o *.dll *.exe
Преди да преминем към MATLAB, нека тестваме библиотеката с C програма:
main.c
#include <stdio.h>
#include <stdlib.h>
#include "version.h"
int main()
{
char *str = NULL;
myGetVersion(&str);
printf("%s\n", str);
free(str);
return 0;
}
Сега, когато всичко работи, ето как да използвате тази библиотека от MATLAB:
testDLL.m
%# load DLL and check exported functions
loadlibrary libversion.dll version.h
assert( libisloaded('libversion') )
libfunctions libversion -full
%# pass c-string by reference
pstr = libpointer('stringPtrPtr',{''}); %# we use a cellarray of strings
get(pstr)
calllib('libversion','myGetVersion',pstr)
dllVersion = pstr.Value{1}
%# unload DLL
unloadlibrary libversion
Резултатът с върнатия низ:
Functions in library libversion:
stringPtrPtr myGetVersion(stringPtrPtr)
Value: {''}
DataType: 'stringPtrPtr'
dllVersion =
1.0.0
person
Amro
schedule
16.09.2011