Запись файла MATLAB из DLL, вызываемой LabVIEW

После тестирования только одного кода я решил, наконец, включить его в проект. Проблема в том, что когда LabVIEW 2010 (SP1, 64-разрядная версия) загружает пользовательскую DLL, она просматривает зависимости и находит, что ей нужно tbb.dll в конце концов. Ну, насколько я могу судить, LabVIEW использует свою собственную версию tbb.dll. И в его версии отсутствует точка входа ?throw_exception_v4@internal@tbb@@YAXW4exception_id@12@@Z, Я запускал функцию раньше отдельно, и она работала нормально. Казалось бы, это не неслыханная ошибка LabVIEW, которая не была устранена.

Поскольку это зависимость от сторонней библиотеки, я могу либо не использовать библиотеки MATLAB и делать все с нуля, либо заставить LabVIEW загрузить рабочую версию tbb.dll, что означает копирование DLL в Windows папка. Ни одно из этих решений не подходит для использования. Кроме того, у нас нет лицензии на MathScript. Есть идеи?

На случай, если я что-то не так сделал, когда модифицировал их пример, упрощенная версия моего кода выглядит следующим образом:

#include "stdafx.h"#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include "mat.h"#include "createMatFile.h"
export "C" int createMatFile(const char *filename, int* dataArray, int count)
{
MATFile *pmat;
mxArray *data;
mwSize dims[2] = {1,1};

//Open the file to write to
pmat = matOpen(filename, "w");
if (pmat == NULL) {
printf("Error creating file %s\n", filename);
printf("(Do you have write permission in this directory?)\n");
return(EXIT_FAILURE);
}

//Convert data to double
double* dataDouble = new double[count];

for(int i=0; i<count; i++)
{
dataDouble[i] = (double)data[i];
}

//Populate the mxArrays
dataArray = mxCreateDoubleMatrix(1,count,mxREAL);
memcpy((void *)(mxGetPr(dataArray)), (void *)dataDouble, sizeof(*dataDouble)*count);

//Put the shape struct in the .mat file
int status = matPutVariable(pmat, "data", dataArray);
if (status != 0) {
printf("%s :  Error using matPutVariable on line %d\n", __FILE__, __LINE__);
return(EXIT_FAILURE);
}

//Clean up
delete [] dataDouble;
mxDestroyArray(dataArray);

//Close the file to write to
if (matClose(pmat) != 0) {
printf("Error closing file %s\n",filename);
return(EXIT_FAILURE);
}

return EXIT_SUCCESS;
}

Файл .h является всего лишь прототипом функции.

3

Решение

Поскольку LabVIEW устанавливает свою собственную версию tbb.dll в путь Windows и загружает ее, единственный способ исправить это — скопировать новую tbb.dll в папку system32. Это не очень хорошее решение, поэтому единственный возможный ответ:

  • Используйте этот взлом system32, который, вероятно, вызовет другие проблемы в будущем.
  • Создайте некоторый хак для динамической загрузки нужной DLL в отдельный процесс без загрузки из LabVIEW и вызова библиотеки MATLAB из этого процесса, а затем верните значение, вычисленное процессу LabVIEW. Поскольку моя программа только записывает данные в файл, ей не нужно ничего возвращать обратно в LabVIEW, что упрощает этот выбор.
  • Или просто прекратите использовать MATLAB и LabVIEW вместе.
1

Другие решения


По вопросам рекламы [email protected]