2015-11-18 2 views
1

Я работал с двумя внешними функциями в Dymola через две библиотеки DLL. Я столкнулся с проблемой, которая заставляла меня задуматься о том, как компилятор действительно находит внешнюю функцию. Таким образом, функции в двух разных DLL имеют одно и то же имя и один и тот же набор входных и выходных переменных, но выполняют разные задачи.Вызов функции Modelica External C с использованием DLL

void Execute(int in_1, bool flag_in, bool* flag_out, int* out_1); 

я определил их как следующее в функции внешнего интерфейса в Modelica:

function testFunc1 

    input Integer in_1; 
    input Boolean flag_in; 
    output Boolean flag_out; 
    output Integer[5] out_1; 

    external C Execute(int in_1, bool flag_in, bool* flag_out, int* out_1) 
    annotation(Library = "DLL1"); 
end testFunc1; 

и вторая функция была вызвана внутри другой функции Modelica называется testFunc2 так же, как выше. То, что я наблюдал, было, поскольку внешние функции имеют одинаковые имена и один и тот же набор входных и выходных переменных, несмотря на определенное имя библиотеки, компилятор ошибочно выбирает неправильную функцию из другой DLL и выполняет ее.

Мне было интересно, есть ли способ заставить компилятор просматривать только конкретную DLL при поиске внешней функции? или внешние функции не должны иметь одинаковые имена вообще? Или есть лучший способ представить DLL для Modelica?

ответ

3

Если вам действительно нужны символы, которые будут называться одним и тем же, используйте LoadLibrary и т. Д. Из win32 API. Кроме того, вы должны, вероятно, дать функции уникальные имена для кросс-инструмента и кросс-платформенной совместимости.

+1

Благодарим вас за ответ. Я действительно не знаком с LoadLibrary из API win32. Не могли бы вы добавить ссылку, чтобы я мог найти какую-то информацию? Благодаря! – Shaga

+2

[MSDN: LoadLibraryEx] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179 (v = vs.85) .aspx) – xmojmr

+0

Я просто использовал LoadLibrary для загрузки DLL, просто используя 'HMODULE hModule = LoadLibrary (L" C: \ mylib.dll ")'. Хотя библиотека найдена в VM, dymola не может ее найти, а hModule возвращается как null. Что может быть причиной? – Shaga

1

Имеет ли библиотека библиотеку DLL и LIB или только DLL?

Если есть LIB-файл, Dymola свяжется с ним - и это может вызвать проблему выше, но без LIB-файла Dymola 2016 должен перейти непосредственно в DLL.

Но использование разных имен обычно проще.

+0

У меня есть файлы DLL и Lib. – Shaga