Несоответствие типа данных при передаче аргумента

В настоящее время у меня возникает следующая проблема. Я искал любое решение, но не смог найти ничего полезного, связанного с моей проблемой.

Я хочу использовать VBA для предоставления некоторых параметров автономной DLL, которая будет вычислять для меня результат.

Моя проблема: как только я пытаюсь обработать значения, переданные функции setCEPCI, я получаю сообщение «Microsoft Excel перестала работать» – ошибка (без дальнейших подробностей). Однако, если я помещаю эти три строки (см. Мой скопированный код) в комментарии, все работает нормально. Я попробовал много обходных решений, но все это дошло до этих строк. Удивительно, но я могу использовать переданные аргументы в первой функции getPEC , где, например, x – мой отток .

Для записи я использую файл def для экспорта функции, хотя IMHO ошибка, похоже, является некотором несоответствием типов данных.

EDIT: для уточнения: если моя DLL не найдена, например, я получаю ту же ошибку Microsoft-Excel из-за назначения RV. Если я попытаюсь присвоить значение RV в первой функции, я также получу эту ошибку. С другой стороны, я могу без каких-либо проблем присвоить значение PEC.

Моя DLL выглядит так:

extern "C" { typedef void(CALLBACK * FncPtrClssGetCEPCI)(CEPCIvalues &, int, int, int &); double PEC_backUp; const int numbMaxCEPCIlistMembers = 3; CEPCIvalues cepcilist_backUp[numbMaxCEPCIlistMembers]; void __stdcall getPEC(int typeOfPump, double outflow, double &PEC, int &RV) { //y = ax^6 + bx^5 + cx^4 + dx^3 + ex^2 + fx^1 + gx^0 if ((typeOfPump < 1) || (10 < typeOfPump)) { RV = -1; return; } double a, b, c, d, e, f, g; //... PEC_backUp = a * pow(outflow, 6.0) + b * pow(outflow, 5.0) + c * pow(outflow, 4.0) + d * pow(outflow, 3.0) + e * pow(outflow, 2.0) + f * pow(outflow, 1.0) + g * pow(outflow, 0.0); double EUR_USD_07_2000 = 0.939082609; PEC_backUp = PEC_backUp / EUR_USD_07_2000; PEC = PEC_backUp; } void __stdcall setCEPCI(int monthIN, int yearIN, int &RV) { //HINSTANCE hinstCEPCI = LoadLibraryEx("CEPCI.dll", NULL, LOAD_LIBRARY_SEARCH_APPLICATION_DIR); HINSTANCE hinstCEPCI = LoadLibrary("C:\\Users\\...somePath...\\CEPCI.dll"); if (!hinstCEPCI) { RV = -11; return; } FncPtrClssGetCEPCI ptrGetCEPCI = (FncPtrClssGetCEPCI)GetProcAddress(hinstCEPCI, "getCEPCI"); if (!ptrGetCEPCI) { RV = -22; return; } //CEPCI values of 13/1970 and 07/2000 are automatically extracted //due to less interaction and, thus, risk of errors in user input int monthIN_auto = 13; int yearIN_auto = 1970; ptrGetCEPCI(cepcilist_backUp[0], monthIN_auto, yearIN_auto, RV); monthIN_auto = 7; yearIN_auto = 2000; ptrGetCEPCI(cepcilist_backUp[1], monthIN_auto, yearIN_auto, RV); //now extract CEPCI value of user specific input // monthIN_auto = monthIN; // yearIN_auto = yearIN; ptrGetCEPCI(cepcilist_backUp[2], monthIN_auto, yearIN_auto, RV); CEPCIvalues cepcilist; cepcilist = cepcilist_backUp[2]; // RV = monthIN + yearIN; ptrGetCEPCI = 0; FreeLibrary(hinstCEPCI); hinstCEPCI = 0; return; } 

Мой код VBA выглядит так:

 Public Declare Sub getPEC _ Lib "C:\Users\...somePath...\OPunit0011PUMP.dll" _ (ByVal typeOfPump As Integer, ByVal outflow As Double, ByRef PEC As Double, ByRef RV As Integer) Public Declare Sub setCEPCI _ Lib "C:\Users\...somePath...\OPunit0011PUMP.dll" _ (ByVal monthIN As Integer, ByVal yearIN As Integer, ByRef RV As Integer) Function CallPump() Dim typeOfPump, RV, monthIN, yearIN As Integer typeOfPump = 9 Dim outlfow, PEC As Double outflow = 100 monthIN = 5 yearIN = 2008 Call getPEC(typeOfPump, outflow, PEC, RV) Call setCEPCI(monthIN, yearIN, RV) End Function 

Любая помощь приветствуется. Заранее спасибо.

Думаю, я решил свою проблему.

Глядя на код VBA

 Dim typeOfPump, RV, monthIN, yearIN as Integer 

по любой причине, объявленной только typeOfPump как целое, остальные были (при мониторинге с реализованной функцией просмотра Excel) еще вариант. Письмо

 Dim typeOfPump as Integer Dim RV as Integer ... 

похоже, решает проблему. К сожалению, я не могу объяснить, что не так с первой строкой.

Давайте будем гением компьютера.