1 Внимательно изучи expertы/samples/DllSample
2.скинь dll source в форум
Даже не глядя вижу проблему: переменные типа int передаются из MQL4 во внешние длл не по указателю, а по значению. Т.е. должно быть fndll4(int n).
Я пробовал по разно му и через указаетли и просто, но результат был всегда одинаков . Я вот в примерах нашел __stdcall. В нете почитал про него что это конвертор вызовов у меня в коде такого не было. Может в этом причина. Щас буду разбираться как встроить его в код
Извиняюсь, я пропустил Ваш пост. Видимо он появился пока я готовил файл.))) Да именно в нем проблема. Правда пока не удалось запустить. Спасибо за ответ!!! Вроде и просто, но вчера целый вечер убил и не смог подключить.
Напишу еще, может кто столкнется с проблемой.
Есть 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 );
А то за деревьями уже и леса не видно :)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Проблема такая. Подключаю 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)
Объясните пожалуйста, где хоть копать.