Avatar billede jetsetter Nybegynder
18. juli 2009 - 21:23 Der er 17 kommentarer og
1 løsning

Indsætte ekstra variabel i c++ kode.

jeg vil gerne indsætte en ekstra variabel (string) i denne kode, lad os kalde den par0:

Jeg har lært mig C# og så troede jeg at jeg let kunne rette i c++ kode, men jeg forstår kun 50% eller mindre.. :(

Skal jeg virkelig lære hele sproget eller er der en som kan hjælpe med at indsætte en "ekstra" variabel i koden?




#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
//----
#define MT4_EXPFUNC __declspec(dllexport)
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#pragma pack(push,1)

struct RateInfo
  {
  unsigned int      ctm;
  double            open;
  double            low;
  double            high;
  double            close;
  double            vol;
  double            vol1;
  double            vol2;
  double            vol3;
  double            vol4;
  double            vol5;

  };

#pragma pack(pop)
 
struct MqlStr
  {
  int              len;
  char            *string;
  };
 
static int CompareMqlStr(const void *left,const void *right);
 
static int SQLexecProcedure( char *nprc );
static int SQLexecProcedureSignal( char *sSymbol, char* sProcedure );
// static int _YZSQLsqlstrinsql( char *Symbol , unsigned int DateTime , double Ask, double Bid, char *NamePrc );
static int _YZSQLprocedure  ( char *sSymbol, unsigned int pDateTime, double Ask, double Bid, char *NamePrc );
static int _YZSQLprocedureHISTORYPut(char *Symbol,unsigned int Period, unsigned int DateTime,double Open,
            double High,double  Low, double Close ,double Volume, unsigned int Bar ,char *Procedure);

                                                                                                           
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  {
//----
  switch(ul_reason_for_call)
    {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
        break;
    }
//----
  return(TRUE);
  }

// place ticks in MS SQL
// call the procedure as an SQL line passing parameters  "exec YZ_MT4_TICK ?,?,?,?"
/*
  MT4_EXPFUNC int  __stdcall SQLsqlstringTickPut(char *Symbol,unsigned int DateTime,double Ask,double Bid,char *sSQLstring)
{
    int ccc =  _YZSQLsqlstrinsql( Symbol  , DateTime ,  Ask , Bid  , sSQLstring  );
    return(ccc);
}
*/

// call as a procedure passing parameters
  MT4_EXPFUNC int  __stdcall SQLProcedureTickPut(char *Symbol,unsigned int DateTime,double Ask,double Bid,char *Procedure)
{
    int ccc =  _YZSQLprocedure( Symbol  , DateTime ,  Ask , Bid  ,Procedure );
    return(ccc);
}

// place a specific candlestick in MS SQL history
MT4_EXPFUNC int  __stdcall SQLProcedureHistoryPut(char *Symbol,unsigned int Period , unsigned int DateTime,
        double Open,double High,double  Low, double Close ,double Volume,unsigned int Bar ,char *Procedure)
{
    int ccc  =  _YZSQLprocedureHISTORYPut(Symbol,Period,DateTime,Open,High,Low,Close,Volume,Bar,Procedure);
    return(ccc);
}


// call procedure sProcedure
//
// return -1 error
//
MT4_EXPFUNC int  __stdcall SQLProcedureGetInt(char *sProcedure)
{
        int Ret =    SQLexecProcedure( sProcedure );
    return((int)Ret);
}


MT4_EXPFUNC int  __stdcall SQLProcedureGetSignal  (char *sSymbol, char *sProcedure)
{
   
    int Ret =    SQLexecProcedureSignal( sSymbol, sProcedure );
    return((int)Ret);
}
 
//////////////////////////////////
#include "stdafx.h"
#include <stdio.h>
#import "C:\Program Files\Common Files\System\ado\msado20.tlb" \
        rename("EOF","ADOEOF") rename("BOF","ADOBOF")

using namespace ADODB;
 
inline void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); };

// procedure call method
int _YZSQLprocedure( char *sSymbol, unsigned int pDateTime, double Ask, double Bid,  char *NamePrc )
{
 
  HRESULT hr = S_OK;
  _CommandPtr pCmd = NULL;
  _ConnectionPtr pConnection = NULL;
  _bstr_t strMessage, strAuthorID;

      ::CoInitialize(NULL);

  long codRet = -1;

  try {
     
      _ParameterPtr Par1;
      _ParameterPtr Par2;
      _ParameterPtr Par3;
      _ParameterPtr Par4;
      _ParameterPtr Par5;

      TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
      hr = pConnection->Open("dsn=MT4_SQL_BASE;", "yuraz", "qwerty", adConnectUnspecified);
      pConnection->CursorLocation = adUseClient;
      TESTHR(pCmd.CreateInstance(__uuidof(Command)));
      pCmd->CommandText = NamePrc;  // procedure name
      pCmd->CommandType = adCmdStoredProc;
   
      Par1 = pCmd->CreateParameter( _bstr_t("@P1"), adInteger,  adParamOutput,0,    codRet );
      pCmd->Parameters->Append( Par1 );
      Par1 = pCmd->CreateParameter("@psSymbol",adChar, adParamInput, strlen(sSymbol) ,sSymbol );
        pCmd->Parameters->Append(Par1);
      Par2 = pCmd->CreateParameter("@piDateTime", adDouble , adParamInput, sizeof(double) ,  (double)pDateTime );
      pCmd->Parameters->Append(Par2);
      Par3 = pCmd->CreateParameter("@pdAsk", adDouble, adParamInput, 4, Ask );
      pCmd->Parameters->Append(Par3);
      Par4 = pCmd->CreateParameter("@pdBid", adDouble, adParamInput, 4, Bid );
      pCmd->Parameters->Append(Par4);

     
      pCmd->ActiveConnection = pConnection;
      int hr = pCmd->Execute( 0, 0, adCmdStoredProc );
      if( FAILED(hr) )
      {
                codRet = -1;
      }
      else
      {
        Par1 = pCmd->Parameters->GetItem(_bstr_t("@P1"));    // obtain from the procedure
        codRet = Par1->GetValue();
      }
  }
  catch(_com_error  ) {
      //
      // if necessary, process the execution error
          //
      codRet = -1;

  }
  if (pConnection)
      if (pConnection->State == adStateOpen)
        pConnection->Close();

  ::CoUninitialize();
    return((int)codRet);
}



// place in history Symbol , Period . DateTime, Open , High , Low , Close , Value , Bar
int _YZSQLprocedureHISTORYPut(char *pSymbol,unsigned int pPeriod, unsigned int pDateTime,double pOpen,double pHigh,
                    double  pLow, double pClose ,double pVolume, unsigned int pBar ,char *pProcedure )
{


        HRESULT hr = S_OK;
  _CommandPtr pCmd = NULL;
  _ConnectionPtr pConnection = NULL;
  _bstr_t strMessage, strAuthorID;

      ::CoInitialize(NULL);

  long codRet = -1;

  try {

      _ParameterPtr ParReturn; //
      _ParameterPtr Par1; // SYMBOL
      _ParameterPtr Par2; // PERIOD
      _ParameterPtr Par3; // DATETIME
      _ParameterPtr Par4; // OPEN
      _ParameterPtr Par5; // HIGH
      _ParameterPtr Par6; // LOW
      _ParameterPtr Par7; // CLOSE
      _ParameterPtr Par8; // VOLUME
      _ParameterPtr Par9; // BAR


      TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
      hr = pConnection->Open("dsn=MT4_SQL_BASE;", "yuraz", "qwerty", adConnectUnspecified);
      pConnection->CursorLocation = adUseClient;
      TESTHR(pCmd.CreateInstance(__uuidof(Command)));
      pCmd->CommandText = pProcedure;  // procedure name
      pCmd->CommandType = adCmdStoredProc;
   
      ParReturn = pCmd->CreateParameter( _bstr_t("@P1"), adInteger,  adParamOutput,0,    codRet );
      pCmd->Parameters->Append( ParReturn );

      Par1 = pCmd->CreateParameter("@psSymbol",adChar, adParamInput, strlen(pSymbol) ,pSymbol );
        pCmd->Parameters->Append(Par1);

      Par2 = pCmd->CreateParameter("@piDateTime", adDouble , adParamInput, sizeof(double) ,  (double)pPeriod );
      pCmd->Parameters->Append(Par2);

      Par3 = pCmd->CreateParameter("@piDateTime", adDouble , adParamInput, sizeof(double) ,  (double)pDateTime );
      pCmd->Parameters->Append(Par3);

      Par4 = pCmd->CreateParameter("@pdOpen", adDouble, adParamInput, 4, pOpen );
      pCmd->Parameters->Append(Par4);

      Par5 = pCmd->CreateParameter("@pdHigh", adDouble, adParamInput, 4, pHigh );
      pCmd->Parameters->Append(Par5);

      Par6 = pCmd->CreateParameter("@pdLow", adDouble, adParamInput, 4, pLow );
      pCmd->Parameters->Append(Par6);

      Par7 = pCmd->CreateParameter("@pdClose", adDouble, adParamInput, 4, pClose );
      pCmd->Parameters->Append(Par7);
     
      Par8 = pCmd->CreateParameter("@pdVolume", adDouble, adParamInput, 4, pVolume );
      pCmd->Parameters->Append(Par8);

      Par9 = pCmd->CreateParameter("@piBar", adDouble , adParamInput, sizeof(double) ,  (double)pBar );
      pCmd->Parameters->Append(Par9);


      pCmd->ActiveConnection = pConnection;
      int hr = pCmd->Execute( 0, 0, adCmdStoredProc );
      if( FAILED(hr) )
      {
                codRet = -1;
      }
      else
      {
        ParReturn = pCmd->Parameters->GetItem(_bstr_t("@P1"));    // obtain from the procedure
        codRet = ParReturn->GetValue();
      }
  }
  catch(_com_error  ) {
      //
      // if necessary, process the execution error
          //
      codRet = -1;

  }
  if (pConnection)
      if (pConnection->State == adStateOpen)
        pConnection->Close();

  ::CoUninitialize();
    return((int)codRet);
}


//
// return the value returned by the procedure
//
int  SQLexecProcedure( char *nprc )
{
 
    HRESULT hr = S_OK;
  _CommandPtr pcmd = NULL;
  _ConnectionPtr pConnection = NULL;
  _bstr_t strMessage, strAuthorID;

      ::CoInitialize(NULL);

  long codRet = -1;

  try {
      TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
      hr = pConnection->Open("dsn=MT4_SQL_BASE;", "yuraz", "qwerty", adConnectUnspecified);
      pConnection->CursorLocation = adUseClient;
      TESTHR(pcmd.CreateInstance(__uuidof(Command)));
      pcmd->CommandText = nprc;  // procedure name
      pcmd->CommandType = adCmdStoredProc;
   
      _ParameterPtr  pParm1 = pcmd->CreateParameter( _bstr_t("@P1"), adInteger,  adParamOutput,0,    codRet );
      pcmd->Parameters->Append( pParm1 );
      pcmd->ActiveConnection = pConnection;
      int hr = pcmd->Execute( 0, 0, adCmdStoredProc );
      if( FAILED(hr) )
      {
                codRet = -1;
      }
      else
      {
        pParm1 = pcmd->Parameters->GetItem(_bstr_t("@P1"));    // obtain from the procedure
        codRet = pParm1->GetValue();
      }
  }
  catch(_com_error  ) {
      //
      // if necessary, process the execution error
          //
      codRet = -1;

  }
  if (pConnection)
      if (pConnection->State == adStateOpen)
        pConnection->Close();

  ::CoUninitialize();
    return((int)codRet);
}

//
//
//
int  SQLexecProcedureSignal( char *sSymbol, char* sProcedure )
{
 
    HRESULT hr = S_OK;
  _CommandPtr pcmd = NULL;
  _ConnectionPtr pConnection = NULL;
  _bstr_t strMessage;
  _bstr_t strAuthorID;

      ::CoInitialize(NULL);

  long codRet = 0;

  try {
      TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
      hr = pConnection->Open("dsn=MT4_SQL_BASE;", "yuraz", "qwerty", adConnectUnspecified);
      pConnection->CursorLocation = adUseClient;
      TESTHR(pcmd.CreateInstance(__uuidof(Command)));
      pcmd->CommandText = sProcedure;  // procedure name
      pcmd->CommandType = adCmdStoredProc;

      _ParameterPtr pParm1 = pcmd->CreateParameter("@psSymbol",adChar, adParamInput, strlen(sSymbol) ,sSymbol );
      pcmd->Parameters->Append(pParm1);
      _ParameterPtr pParm2 = pcmd->CreateParameter( _bstr_t("@P1"), adInteger,  adParamOutput,0,    codRet );
      pcmd->Parameters->Append( pParm2 );
      pcmd->ActiveConnection = pConnection;
      int hr = pcmd->Execute( 0, 0, adCmdStoredProc );
            if( FAILED(hr) )
            {
                bool bSuccess = false;
            }
            pParm2 = pcmd->Parameters->GetItem(_bstr_t("@P1"));    // obtain from the procedure
            codRet = pParm2->GetValue();

//            printf("\n [%d] \n",codRet );      // OBTAINING from the procedure
  }
  catch(_com_error  ) {
      //
      // if necessary, process the execution error
          //
  }
  if (pConnection)
      if (pConnection->State == adStateOpen)
        pConnection->Close();

  ::CoUninitialize();
    return((int)codRet);
}
Avatar billede jetsetter Nybegynder
18. juli 2009 - 21:25 #1
Det er kune for "procedureHISTORYPut" der skal oprettes en ekstra "string" variabel
Avatar billede jetsetter Nybegynder
18. juli 2009 - 21:27 #2
Tillægs spørgsmål: hvordan converterer jeg koden som er skrevet i c++ v6 til den nyeste c++ ?
Avatar billede arne_v Ekspert
18. juli 2009 - 21:28 #3
Mener du et ekstra argument ?
Avatar billede jetsetter Nybegynder
18. juli 2009 - 21:34 #4
jeg troede det var en variabel, men det kanske at det er et argument der er tale om.

dll bliver brugt til at transportere data mellem SQL og applicationen.

Fandt også lige ud af at det er for "SQLProcedureTickPut" der skal bruges et ekstra argument og ikke "procedureHISTORYPut" SORRY.
Avatar billede jetsetter Nybegynder
18. juli 2009 - 22:10 #5
Kom nu Arne, please help me :).. jeg har virkelig brug for at få dette problem løst..

Hvor mange points vil du have ? :)
Avatar billede jetsetter Nybegynder
18. juli 2009 - 22:19 #6
Citat fra arne_v:

"Ellers bør du fint kunne builde en VC++ 6 kompatibel DLL med VC++ 9.

Men compiler options skal naturligvis sættes rigtigt. Og du skal også sikre dig at diverse DLL versioner passer. "

Kan jeg også tage koden som er skrevet i VC++ 6 og åbne i VC++ 9 og skrive videre?? Vil du forklarer i flere detaljer? ;)
Avatar billede arne_v Ekspert
19. juli 2009 - 02:16 #7
MT4_EXPFUNC int  __stdcall SQLProcedureTickPut(char *Symbol,unsigned int DateTime,double Ask,double Bid,char *Procedure)
{
    int ccc =  _YZSQLprocedure( Symbol  , DateTime ,  Ask , Bid  ,Procedure );
    return(ccc);
}

->

  MT4_EXPFUNC int  __stdcall SQLProcedureTickPut(char *Symbol,unsigned int DateTime,double Ask,double Bid,char *Procedure, char *something)
{
    int ccc =  _YZSQLprocedure( Symbol  , DateTime ,  Ask , Bid  ,Procedure );
    return(ccc);
}

eller ?

Men det her er .C filen - er der ikke også en .H fil som skal tilrettes tilsvarende ?
Avatar billede arne_v Ekspert
19. juli 2009 - 02:17 #8
Jeg ville prøve at lave et nyt DLL projekt via VS 2008 wizard og så kopiere indholdet af .C og .H ind.
Avatar billede jetsetter Nybegynder
19. juli 2009 - 15:40 #9
Så vidt jeg kan se indeholder .H kun dette:

#pragma once

#define WIN32_LEAN_AND_MEAN      // Exclude rarely-used stuff from Windows headers
#include <windows.h>
Avatar billede jetsetter Nybegynder
19. juli 2009 - 15:44 #10
Hvis jeg laver en dll i C# får jeg en fejl, nemlig error 127 og den kan ikke kalde funktionen. Dette har jeg fundet ud af er fordi der ikke er en DEF fil og derfor bliver funktionen ikke exporteret. er der en løsning til dette, så jeg kan kode dll i C# istedet? Noget med managed og unmanaged dll??
Avatar billede arne_v Ekspert
19. juli 2009 - 21:34 #11
Usædvaneligt at der ikke er en .H fil med det applikations specifikke (den du viser er nogle generelle ting).

Du siger at problemet er at symbolerne ikke bliver eksporteret ?

Hvilke kommando switche ender compileren op med at bruge (kan ses i output vinduet) ?
Avatar billede jetsetter Nybegynder
19. juli 2009 - 22:11 #12
Jeg har idag lært mig mere om c++ og gennemført en tutorial specielt om at lave dll til MetaTrader, som ovennævnte dll også er til. Jeg har fundet ud af at det er normalt for disse dll ikke at have en header-fil.

Jeg er ikke helt sikker på hvad du mener med "symbolerne"?

"Hvilke kommando switche ender compileren op med at bruge (kan ses i output vinduet) ? "

mener du når jeg kompiler c# dll'en?

Det jeg har læst mig frem til, er at Metatrader kun kan tage dll kodet i c++, pga c# er managed (eller noget i den retning).

Jeg er stadig totalt ny i c++.
Avatar billede arne_v Ekspert
20. juli 2009 - 02:18 #13
symbolerne = de funktioner i DLL som skal ses af ekstern kode

kommando switch - nej for C++
Avatar billede jetsetter Nybegynder
20. juli 2009 - 09:35 #14
Symbolerne bliver eksporteret nu, idet jeg gik over til at bruge c++.

Jeg har fået min kode til at virke, ved at kopierer ovenstående kode ind, kun for proceduren "puttick", og compile.

MEN når jeg tiltøjer et ekstra argument, virker det ikke...

her min nye kode, kan du se hvad der er galt?

#define WIN32_LEAN_AND_MEAN

#define MT4_EXPFUNC __declspec(dllexport)

//+-----------------------------------------------------------------------------------------------------------------------------+


static int _YZSQLprocedure  ( char *sSymbol, unsigned int pDateTime, double Ask, double Bid, char *bBroker, char *NamePrc );

// call as a procedure passing parameters
  MT4_EXPFUNC int  __stdcall SQLProcedureTickPut(char *Symbol,unsigned int DateTime,double Ask,double Bid, char *Broker,char *Procedure)
{
    int ccc =  _YZSQLprocedure( Symbol  , DateTime ,  Ask , Bid ,Broker, Procedure );
    return(ccc);
}


#include "stdafx.h"
#include <stdio.h>
#import "C:\Program Files\Common Files\System\ado\msado20.tlb" \
        rename("EOF","ADOEOF") rename("BOF","ADOBOF")

using namespace ADODB;

inline void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); };

// procedure call method
int _YZSQLprocedure( char *sSymbol, unsigned int pDateTime, double Ask, double Bid, char *bBroker,  char *NamePrc )
{

  HRESULT hr = S_OK;
  _CommandPtr pCmd = NULL;
  _ConnectionPtr pConnection = NULL;
  _bstr_t strMessage, strAuthorID;

      ::CoInitialize(NULL);

  long codRet = -1;

  try {
   
      _ParameterPtr Par1;
      _ParameterPtr Par2;
      _ParameterPtr Par3;
      _ParameterPtr Par4;
      _ParameterPtr Par5;
//    _ParameterPtr Par6;

      TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
      hr = pConnection->Open("dsn=MT4TRADE;", "sa", "GoodB2009", adConnectUnspecified);
      pConnection->CursorLocation = adUseClient;
      TESTHR(pCmd.CreateInstance(__uuidof(Command)));
      pCmd->CommandText = NamePrc;  // procedure name
      pCmd->CommandType = adCmdStoredProc;
 
      Par1 = pCmd->CreateParameter( _bstr_t("@P1"), adInteger,  adParamOutput,0,    codRet );
      pCmd->Parameters->Append( Par1 );
      Par1 = pCmd->CreateParameter("@psSymbol",adChar, adParamInput, strlen(sSymbol) ,sSymbol );
        pCmd->Parameters->Append(Par1);
      Par2 = pCmd->CreateParameter("@piDateTime", adDouble , adParamInput, sizeof(double) ,  (double)pDateTime );
      pCmd->Parameters->Append(Par2);
      Par3 = pCmd->CreateParameter("@pdAsk", adDouble, adParamInput, 4, Ask );
      pCmd->Parameters->Append(Par3);
      Par4 = pCmd->CreateParameter("@pdBid", adDouble, adParamInput, 4, Bid );
      pCmd->Parameters->Append(Par4);

      Par5 = pCmd->CreateParameter("@pbBroker",adChar, adParamInput, strlen(bBroker) ,bBroker );
        pCmd->Parameters->Append(Par5);

   
      pCmd->ActiveConnection = pConnection;
      int hr = pCmd->Execute( 0, 0, adCmdStoredProc );
      if( FAILED(hr) )
      {
                codRet = -1;
      }
      else
      {
        Par1 = pCmd->Parameters->GetItem(_bstr_t("@P1"));    // obtain from the procedure
        codRet = Par1->GetValue();
      }
  }
  catch(_com_error  ) {
      //
      // if necessary, process the execution error
          //
      codRet = -1;

  }
  if (pConnection)
      if (pConnection->State == adStateOpen)
        pConnection->Close();

  ::CoUninitialize();
    return((int)codRet);
}
Avatar billede jetsetter Nybegynder
20. juli 2009 - 13:38 #15
Jeg har fundet fejlen, det var ODCB'en der var sat forkert op..

tak for hjælpen.
Avatar billede jetsetter Nybegynder
20. juli 2009 - 13:38 #16
svar venligst så du kan få dine points :)
Avatar billede arne_v Ekspert
21. juli 2009 - 03:13 #17
Nej tak. Jeg forstod aldrig hvad det var du havde gang i. Bare tag point selv.
Avatar billede jetsetter Nybegynder
22. juli 2009 - 12:55 #18
hehe ok, men tak for forsøget..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester