Прошу указать ошибку(и) в проекте Borland c++ Builder 6.0 (dll)

 

Добрый день

была задача написать dll для укладки тиков в MSSQL 2005 Diveloper

Создал три функции

SQLConnect

SQLExecProc

SQLClose

Первая производит соединение с сервером

Вторая производит вызов процедуры на сервере

Третья закрывает соединение

Задача была сделать так чтобы производить соединение из секции init MQL4

В секции start вызов только укладки тиков

а в секции deinit закрытие соединения

так как если при получении каждого тика вызывать проверку логина на сервере то это отъедает много системных ресурсов

Написал exe в котором использовал данные функции 

технология работает а вот вынести в dll не получилось

при вызове даже SQLClose терминал падает по крешу (функция вызывается без параметров)

перечитал вроде все что было на этом форуме по данной тебе, выполнил вроде все рекомендации но результат так и остался - креш

Использовал ADO компоненты помещенные на DataModule

также смотрел на пример в MetaTrader`e по dll

вроде ничего не нашел такого чего не сделал я.




Файлы:
 

Во-первых, попробуй избавься от DataModule. То есть в самой dll пропиши все ручками.

Во-вторых, попробуй использовать следующие модификаторы

extern "С" __declspec(dllexport) int __stdcall SQLConnect(char *Login, char *Pass)
В-Третьих, попробуй поиграться с настройками компилятора =)
 
GarF1eld >>:

Во-первых, попробуй избавься от DataModule. То есть в самой dll пропиши все ручками.

Во-вторых, попробуй использовать следующие модификаторы

В-Третьих, попробуй поиграться с настройками компилятора =)

extern "C" __declspec(dllexport)int __stdcall SQLConnect(char *Login, char *Pass);

У меня вот так в  .h обявлено 

а в cpp

просто

int __stdcall SQLConnect(char *Login, char *Pass)

Так разве не вернее ?

 
olyakish >>:

У меня вот так в .h обявлено

сорри, не заметил.

В любом случае не здесь ошибка. Попробуй избавиться от 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;

  ......
 }


 
GarF1eld >>:

... или скомпоновать в 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);
  }
//+------------------------------------------------------------------+
 
попробуй скачать Visual C++ Express Edition от Microsoft.
 
olyakish >>:

Использовал ADO компоненты помещенные на DataModule

А хде создается датамодуль??? я вижу только обращение к нему

 

В студии можно break point поставить. Attach to process ... terminal.exe

и смотрите точное место, где падает.

Если функции вызываются - то, похоже, объявлено все правильно.

Еще тестовый exe можно сделать, изолированный тест, типа.

 
lis >>:

Можешь так попробовать, или возьми для своих ADOConnection1, ADOStoredProc1, DataModule2 выдели память, память не выделена под объекты вот и креш.

ADOConnection1 = new TADOConnection(Application);

А чему в данном случае равен Application? NULL?
Причина обращения: