Подскажите, почему падает терминал...... DLL

 

 Проблема такая. Подключаю dll к советнику, пока просто с пробной функцией которая возвращает переменную int. Если в советнике не прописывать никаких аргументов передаваемых в dll, то нормально происходит возврат. Если указать любой аргумент, то терминал моментально падает с критической ошибкой. dll создавал в 2008 visual studio язык С++

#import "dll3.dll"
int dll();
#import
...........

int r = dll();

Так работает.

#import "dll3.dll"
int dll(int g);
#import
...........

int g = 5;
int r = dll(g);

А вот так НЕ работает.

 Причем не имеет значения, пердусмотрены ли в функции dll входящие аргументы или нет. Выдает вот это

There has been a critical error
Time : 2008.10.03 13:25
Program : Client Terminal
Version : 4.00 (build: 218, 26 Aug 2008)
OS : Windows XP Professional 5.1 Service Pack 3 (Build 2600)
Processors : 2 x X86 (level 6)
Memory : 1047788/428640 kb
Exception : C0000005
Address : 00000000
Access Type : read
Access Addr : 00000000

Registers : EAX=00000001 CS=001b EIP=00000000 EFLGS=00010246
  : EBX=0045F92C SS=0023 ESP=02D0FF1C EBP=02D0FF54
  : ECX=00000000 DS=0023 ESI=01ACA46C FS=003b
  : EDX=000000FF ES=0023 EDI=01ACA474 GS=0000

Stack Trace : 00454DFE 00000000 00000000 00000000
  : 00000000 00000000 00000000 00000000
  : 00000000 00000000 00000000 00000000
  : 00000000 00000000 00000000 00000000

Modules :
  1 : 00400000 007F5194 e:\program files\whc trader 4\terminal.exe
  2 : 016F0000 00004000 c:\program files\unlocker\unlockerhook.dll
  3 : 01700000 00006000 c:\program files\visualtasktips\vtthooks.dll
  4 : 02050000 00411000 c:\windows\system32\xpsp2res.dll
  5 : 02900000 0000D000 c:\program files\volumecontrol2\lhook.dll
  6 : 02AB0000 0001B000 e:\program files\whc trader 4\experts\libraries\dll3.dll
  7 : 10000000 00017000 c:\program files\kaspersky lab\kaspersky internet security 7.0\miscr3.dll
  8 : 10200000 00123000 c:\windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcr90d.dll
  9 : 5B260000 00038000 c:\windows\system32\uxtheme.dll
  10 : 61EC0000 0000E000 c:\windows\system32\mfc42loc.dll
  11 : 698B0000 00058000 c:\windows\system32\hnetcfg.dll
  12 : 71A30000 00040000 c:\windows\system32\mswsock.dll
  13 : 71A70000 00008000 c:\windows\system32\wshtcpip.dll
  14 : 71A80000 00008000 c:\windows\system32\ws2help.dll
  15 : 71A90000 00017000 c:\windows\system32\ws2_32.dll
  16 : 73D90000 000FE000 c:\windows\system32\mfc42.dll
  17 : 746E0000 0004C000 c:\windows\system32\msctf.dll
  18 : 75310000 0002E000 c:\windows\system32\msctfime.ime
  19 : 76350000 00005000 c:\windows\system32\msimg32.dll
  20 : 76360000 0001D000 c:\windows\system32\imm32.dll
  21 : 76380000 00049000 c:\windows\system32\comdlg32.dll
  22 : 76B20000 0002E000 c:\windows\system32\winmm.dll
  23 : 77110000 0008B000 c:\windows\system32\oleaut32.dll
  24 : 773C0000 00103000 c:\windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll
  25 : 774D0000 0013D000 c:\windows\system32\ole32.dll
  26 : 77C00000 00058000 c:\windows\system32\msvcrt.dll
  27 : 77DC0000 000AC000 c:\windows\system32\advapi32.dll
  28 : 77E70000 00092000 c:\windows\system32\rpcrt4.dll
  29 : 77F10000 00049000 c:\windows\system32\gdi32.dll
  30 : 77F60000 00077000 c:\windows\system32\shlwapi.dll
  31 : 77FE0000 00011000 c:\windows\system32\secur32.dll
  32 : 7C800000 000F8000 c:\windows\system32\kernel32.dll
  33 : 7C900000 000B0000 c:\windows\system32\ntdll.dll
  34 : 7C9C0000 0172F000 c:\windows\system32\shell32.dll
  35 : 7E360000 00091000 c:\windows\system32\user32.dll

Call stack :
00454C60:019E [00454DFE] ?InitFunctionInt@CExpertInterior (terminal.exe)

Объясните пожалуйста, где хоть копать.







 

1 Внимательно изучи expertы/samples/DllSample

2.скинь dll source в форум

 
Скорее всего некорректно экспортируется функция из dll. Нужно использовать соглашение вызовов __stdcall. Иначе будет рушиться стек.
 
Во вложении весь проэкт. Фактически он являет собой стандартную длл сгенерированную мастером. Единственно что сделал, это изменил  __declspec(dllexport) эти строчки на эти extern "C" __declspec(dllexport). Иначе функция вообще не виделась в длл. Выхываемая функцияint fndll4(int *n);  Должна вернуть значение 42, независимо от входных данных. Но если их не прописывать в эксперте то нормально, но вот стоит попробовать передать любой аргумент, сразу краш. Помогите))).
Файлы:
dll4.rar  2361 kb
 
Даже не глядя вижу проблему: переменные типа int передаются из MQL4 во внешние длл не по указателю, а по значению. Т.е. должно быть fndll4(int n).
 
bstone >>:
Даже не глядя вижу проблему: переменные типа int передаются из MQL4 во внешние длл не по указателю, а по значению. Т.е. должно быть fndll4(int n).

 Я пробовал по разно му и через указаетли и просто, но результат был всегда одинаков . Я вот в примерах нашел __stdcall. В нете почитал про него что это конвертор вызовов у меня в коде такого не было. Может  в этом причина. Щас буду разбираться как встроить его в код

 

Интересный вы человек. Вы здесь спрашиваете, чтобы не читать, что вам отвечают? :)


bstone писал(а) >>

Скорее всего некорректно экспортируется функция из dll. Нужно использовать соглашение вызовов __stdcall. Иначе будет рушиться стек.

 
bstone >>:

Интересный вы человек. Вы здесь спрашиваете, чтобы не читать, что вам отвечают? :)



 Извиняюсь, я пропустил Ваш пост. Видимо он появился пока я готовил файл.))) Да именно в нем проблема. Правда пока не удалось запустить. Спасибо за ответ!!! Вроде и просто, но вчера целый вечер убил и не смог подключить.

 

 Напишу еще, может кто столкнется с проблемой. 

Есть 3 способа решения (скопировано из интернета)

Первый — создать DEF-файл для Вашего проекта и включить в него раздел EXPORTS так: 
Код
EXPORTS MyFunc

Компоновщик от Microsoft, анализируя этот DEF-файл, увидит, что экспортировать надо обе функции: _MyFunc@8 и MyFunc. Поскольку их имена идентичны (не считая вышеописанных искажений), компоновщик на основе информации из DEF-файла экспортирует только функцию с именем MyFunc, а функцию _MуFunc@8 не экспортирует вообще. 

Второй — надо добавить в Linker->Command line->Additional Options к опциям линкера дополнительные параметры. Например, Вы экспортируете две функции и хотите обойтись без искажения имен, в command line нужно добавить: 
Код
/export:Func1 /export:Func2

Этот способ имеет небольшое ограничение: сравнительно небольшое число экспортируемых функций. Представьте себе программиста, судорожно пытающегося найти опечатку в опциях линкера "/export" для хотя бы полусотни экспортируемых имен... 

Третий способ — Вы можете в .CPP файле написать 
Код
#pragma comment(linker, "/export:Func1=_Func1@4")

и линкер экспортирует как недекорированное имя Func1, так и декорированное имя _Func1@4, причем оба они будут указывать на одну и ту же функцию.

 

Добавлю четвертый, нормальный, способ:


extern "C" __declspec( dllexport ) __stdcall void yourFunctionName( int arg );


А то за деревьями уже и леса не видно :)

 
Кстати, вообще не понимаю, зачем вы лезете в такие дебри, если не особо разбираетесь в них. Может все-таки было бы проще работать на MQL4 ?