Во-первых, попробуй избавься от DataModule. То есть в самой dll пропиши все ручками.
Во-вторых, попробуй использовать следующие модификаторы
extern "С" __declspec(dllexport) int __stdcall SQLConnect(char *Login, char *Pass)В-Третьих, попробуй поиграться с настройками компилятора =)
Во-первых, попробуй избавься от DataModule. То есть в самой dll пропиши все ручками.
Во-вторых, попробуй использовать следующие модификаторы
В-Третьих, попробуй поиграться с настройками компилятора =)extern "C" __declspec(dllexport)int __stdcall SQLConnect(char *Login, char *Pass);
У меня вот так в .h обявлено
а в cpp
просто
int __stdcall SQLConnect(char *Login, char *Pass)
Так разве не вернее ?
сорри, не заметил.
В любом случае не здесь ошибка. Попробуй избавиться от DataModule, или скомпоновать в dll все. то есть поставь компилирование на Release и убери галочку с Build with runtime packages
Можешь так попробовать, или возьми для своих ADOConnection1, ADOStoredProc1, DataModule2 выдели память, память не выделена под объекты вот и креш.
int __stdcall SQLConnect(char *Login, char *Pass)
{
ADOConnection1 = new TADOConnection(Application);
ADOConnection1->ConnectionString= "Provider=SQLOLEDB.1;Data Source=rfserver\SQL;Initial Catalog=database;User ID=sa","
try
{
ADOConnection1->Connected=true;
}
catch(...)
{
Application->MessageBoxA("Нет соединения с БД","Ошибка",MB_OK);
delete ADOConnection1
}
ADOStoredProc1=new TADOStoredProc(Application);
ADOStoredProc1->Connection=sqlcnt;
ADOStoredProc1->ProcedureName="sp_sys_1112";
ADOStoredProc1->Parameters->CreateParameter("@idata",ftString,pdInput,0,NULL);
.....
}
int __stdcall SQLExecProc(char *Symbol, int DateTime, float Bid)
{
ADOStoredProc1->Parameters->ParamValues["@idata"]='select * from table';
ADOStoredProc1->Open();
while (!ADOStoredProc1->Eof)
{
//sprintf(databuf,"%s",ADOStoredProc1->Fields->Fields[0]->AsString.c_str());
ADOStoredProc1->Next();
}
ADOStoredProc1->Close();
}
int __stdcall SQLClose()
{
delete ADOStoredProc1; delete ADOConnection1;
......
}
... или скомпоновать в dll все. то есть поставь компилирование на Release и убери галочку с Build with runtime packages
Это не помогло...
значит остается только уходить от DataModule
А вот кстати креш
There has been a critical error
Time : 2008.11.18 15:07
Program : Client Terminal
Version : 4.00 (build: 216, 16 Apr 2008)
OS : Windows XP Professional 5.1 Service Pack 2 (Build 2600)
Processors : 1 x X86 (level 15)
Memory : 915560/309912 kb
Exception : C0000005
Address : 01BC14B5
Access Type : read
Access Addr : 00000058
Registers : EAX=00000000 CS=001b EIP=01BC14B5 EFLGS=00010286
: EBX=FFFFFFFF SS=0023 ESP=00125C14 EBP=0012603C
: ECX=01BC14B0 DS=0023 ESI=011D9700 FS=003b
: EDX=011DBE68 ES=0023 EDI=00000000 GS=0000
Stack Trace : 004633D7 00454B8E 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
Modules :
1 : 00400000 002A9000 d:\its_my\forex\metatrader 4_real_alpari_micro\terminal.exe
2 : 01BC0000 00061000 d:\its_my\forex\metatrader 4_real_alpari_micro\experts\libraries\mt4_sql_tick.dll
3 : 10000000 00056000 c:\program files\agnitum\outpost firewall\wl_hook.dll
4 : 20000000 002CD000 c:\windows\system32\xpsp2res.dll
5 : 32600000 00176000 c:\progra~1\borland\cbuild~1\bin\cc3260mt.dll
6 : 5B260000 00038000 c:\windows\system32\uxtheme.dll
7 : 61EC0000 0000E000 c:\windows\system32\mfc42loc.dll
8 : 71A80000 00008000 c:\windows\system32\ws2help.dll
9 : 71A90000 00017000 c:\windows\system32\ws2_32.dll
10 : 73D90000 000FE000 c:\windows\system32\mfc42.dll
11 : 746E0000 0004C000 c:\windows\system32\msctf.dll
12 : 76350000 00005000 c:\windows\system32\msimg32.dll
13 : 76380000 00049000 c:\windows\system32\comdlg32.dll
14 : 769A0000 000B4000 c:\windows\system32\userenv.dll
15 : 76B20000 0002E000 c:\windows\system32\winmm.dll
16 : 77110000 0008C000 c:\windows\system32\oleaut32.dll
17 : 773C0000 00103000 c:\windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll
18 : 774D0000 0013D000 c:\windows\system32\ole32.dll
19 : 77C00000 00058000 c:\windows\system32\msvcrt.dll
20 : 77DC0000 000AC000 c:\windows\system32\advapi32.dll
21 : 77E70000 00091000 c:\windows\system32\rpcrt4.dll
22 : 77F10000 00047000 c:\windows\system32\gdi32.dll
23 : 77F60000 00076000 c:\windows\system32\shlwapi.dll
24 : 7C800000 000F7000 c:\windows\system32\kernel32.dll
25 : 7C900000 000B1000 c:\windows\system32\ntdll.dll
26 : 7C9C0000 0081A000 c:\windows\system32\shell32.dll
27 : 7E360000 00091000 c:\windows\system32\user32.dll
Call stack :
0045F580:3E57 [004633D7] ?ExecuteStaticAsm@CExpertInterior (terminal.exe)
004549F0:019E [00454B8E] ?InitFunctionInt@CExpertInterior (terminal.exe)
Я делал похожую прогу только данные передавал в отдельное приложение, а оно уже писало в MSSQL
А в метатрейдор просто вешал индикатор на нужную валюту
#property copyright "Copyright © 2008, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property indicator_chart_window //---- input parameters extern string lpClassName; extern string lpWindowName; int HWNDSO; int SesTcCn; //счётчик тиков int Sbm; //код символа #include <WinUser32.mqh> #define WM_USER 0x0400 //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SesTcCn=0; if(StringLen(lpClassName)==0) { lpClassName="TApplication";//"TApplication"; } if(StringLen(lpWindowName)==0) { lpWindowName="Forex Tick SO"; } Sbm=0; if(Symbol()=="EURUSD") { Sbm=1; } if(Symbol()=="GBPUSD") { Sbm=2; } if(Symbol()=="USDJPY") { Sbm=3; } if(Symbol()=="USDCHF") { Sbm=4; } if(Symbol()=="USDCAD") { Sbm=5; } if(Symbol()=="AUDUSD") { Sbm=6; } if(Symbol()=="USDCAD") { Sbm=7; } if(Symbol()=="EURCHF") { Sbm=8; } if(Symbol()=="EURGBP") { Sbm=9; } if(Symbol()=="EURJPY") { Sbm=10; } if(Symbol()=="EURGBP") { Sbm=11; } if(Symbol()=="EURCAD") { Sbm=12; } if(Symbol()=="EURAUD") { Sbm=13; } if(Symbol()=="GBPCHF") { Sbm=14; } if(Symbol()=="GBPJPY") { Sbm=15; } if(Symbol()=="CHFJPY") { Sbm=16; } //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- Comment(""); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- // //Alert("indicator start()"); HWNDSO = FindWindowA(lpClassName ,lpWindowName); int wParam=0; int lParam=Bid*10000; PostMessageA(HWNDSO,WM_USER+Sbm,wParam,lParam); //Comment (StringConcatenate(Bid," ",Symbol())); Comment (StringConcatenate(HWNDSO," ",lpWindowName)); SesTcCn++; //datetime //---- return(0); } //+------------------------------------------------------------------+
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день
была задача написать dll для укладки тиков в MSSQL 2005 Diveloper
Создал три функции
SQLConnect
SQLExecProc
SQLClose
Первая производит соединение с сервером
Вторая производит вызов процедуры на сервере
Третья закрывает соединение
Задача была сделать так чтобы производить соединение из секции init MQL4
В секции start вызов только укладки тиков
а в секции deinit закрытие соединения
так как если при получении каждого тика вызывать проверку логина на сервере то это отъедает много системных ресурсов
Написал exe в котором использовал данные функции
технология работает а вот вынести в dll не получилось
при вызове даже SQLClose терминал падает по крешу (функция вызывается без параметров)
перечитал вроде все что было на этом форуме по данной тебе, выполнил вроде все рекомендации но результат так и остался - креш
Использовал ADO компоненты помещенные на DataModule
также смотрел на пример в MetaTrader`e по dll
вроде ничего не нашел такого чего не сделал я.