DLL - WinApi - mql

O jezykach programowania w platformach i nie tylko.
crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

DLL - WinApi - mql

Nieprzeczytany post autor: crn »

Jak juz wczesniej zauwazylem na tym forum - przydaloby sie jakeis GUI to ustawiania parametrow w skryptach. Odpowiedzieliscie mi, ze takiego nie ma, stad tez postanowailem takie zrobic.
Zanim zajalem sie moja misja, postanowilem potestowac "co MT4 na to".
Testy nie byly optymistyczne. Wywolujac moja biblioteke pod aplikacja pisana w c/c++ tworzylo sie okno. Natomiast jak wywoluje to spod MT4 poprzez skrypt zwraca blad instancji.
btw: funkcja kwadrat dziala bez zarzutu.

Byc moze moglby ktos pomoc?

Zalaczem wszyskie 3 kody zrodlowe. Kompilator Dev C++

Kod: Zaznacz cały


#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */

extern "C"
{
double DLLIMPORT kwadrat( double liczba );
}

extern "C"
{
int DLLIMPORT okno();
}

class DLLIMPORT DllClass
{
  public:
    DllClass();
    virtual ~DllClass(void);

  private:

};


#endif /* _DLL_H_ */


Kod: Zaznacz cały

/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>

DllClass::DllClass()
{

}


DllClass::~DllClass ()
{

}

HINSTANCE x;
HWND hwnd;


    double DLLIMPORT kwadrat( double liczba ){
        
      
    return(liczba*liczba);       
    };



int APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
                         
                             
                       
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
           
       x = hInst;
       MessageBox( NULL, "TEXT", "main", MB_OK | MB_ICONWARNING | MB_DEFBUTTON2 | MB_OKCANCEL );
           
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
           
              
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return 1;
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        
        default:
		return DefWindowProc( hwnd, msg, wParam, lParam );
    }
}


int okno(  )
{
   
   //MessageBox( NULL, "TEXT", "main", MB_OK | MB_ICONWARNING | MB_DEFBUTTON2 | MB_OKCANCEL );
   

    WNDCLASSEX wc;
   
   HWND hWin = GetActiveWindow();
  // HINSTANCE hInstance = GetWindowLong( hWin, GWL_HINSTANCE);
   
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc; //obsluga komunikatow
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = x;
    //(HINSTANCE)GetWindowLong( hWin, GWL_HINSTANCE);
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 ); //kolor tla
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "Nazwa_Klasy";
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
	wc.style = CS_DBLCLKS;
   
   
 //  RegisterClassEx( & wc );

    if( !RegisterClassEx( & wc ) )
    {

        return 2;
     
        
    }
  
    // TWORZENIE OKNA
       
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, "Nazwa_Klasy", "Nazwa_Okna", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, x, NULL );

    if( hwnd == NULL ) return 4;
    
    ShowWindow( hwnd, 1 ); // Pokaż okienko...
    UpdateWindow( hwnd );
}

mqL:

Kod: Zaznacz cały

#import "teest.dll"
   double kwadrat(double say);
#import

#import "test_ApiDLL.dll"

   int okno();

#import
int start()
  {

  // Print( kwadrat(4) );
   
   Print(okno());
   
   return(0);
  }




Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

crn pisze:przydaloby sie jakeis GUI to ustawiania parametrow w skryptach
tak z czystej ciekawosci ... do czego ?? mozesz bardziej sprecyzowac ??

pozdrawiam
Andrzej PIerz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

jak tworzysz skrypt dosc uceizliwe staje sie zmienianie (chcoiazby wartosci TP/SL) w kodzie za kazdym razem. Chce stworzyc biblioteke, ktora bedize GUI tych ustawien. Liczba parametrow itd beda ustawiane przez wywolanei funkcji, a kontrola bledow juz bedze za pomoca mql - jednak do tego potrzebuje wywolac okno - a to jak na zlosc dziala spod c++, a nei che spod mql'a. Stad tez pytam madrzejszych ode mnie...

Pozdrawiam i ponawiam pytanie, czy ktos ma jakis pomysl?

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

crn pisze:jak tworzysz skrypt dosc uceizliwe staje sie zmienianie (chcoiazby wartosci TP/SL) w kodzie za kazdym razem.
tak tez wlasnie myslalem ;)
nie mapotrzeby zmiany w kodzie z kazdym razem ;)

zobacz tak :

Kod: Zaznacz cały


#property show_inputs

extern int sl = 20;
extern int tp = 20;
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

crn - odwaliles kawal roboty, ale... moze trzeba bylo najpierw zapytac...

Rozwiazanie podane przez Andrzeja jest ogolnie znane...

Zaczynajac czytac twoj post najpierw pomyslalem, ze chodzi ci o reczna zmiane parametrow skryptu juz w czasie pracy - to tez da sie zrobic - np. przez zczytywanie z wykresu wartosci pol tekstowych czy etykiet... lub po prostu zmienne globalne... .

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

Nie wiem czy mam sie cieszyc czy plakac, ale napewno nauczyc sie najpierw czytac dokumentacje ;/

Tak czy inaczej ciekwy ejstem czemu tak sie dzieje, moze ktos zna odpowiedz? :)

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

daj na koniec funkcji okno()
:

Kod: Zaznacz cały


    MSG messages;       
    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

zalaczam poprawiona wersje.

To by w sumie wiele wyjasnilo - okno bylo, tylko odrazu sie zamykalo ;/
w C++ dzialalo, bo sprwadzlem to przez program konsolowy i przed returnem automatycznie wstawilem getchara();

Dzieki wielkie za pomoc. Moze sie przyda? :)

Zawsze mozna pomyslec na jakims ladnym rozwijanym szablonem :)

Kod: Zaznacz cały

/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>

DllClass::DllClass()
{

}


DllClass::~DllClass ()
{

}

HINSTANCE x;
HWND hwnd;
MSG Komunikat;


    double DLLIMPORT kwadrat( double liczba ){
        
      
    return(liczba*liczba);       
    };



int APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
                         
                             
                       
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
           
       x = hInst;
       MessageBox( NULL, "TEXT", "main", MB_OK | MB_ICONWARNING | MB_DEFBUTTON2 | MB_OKCANCEL );
           
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
           
              
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return 1;
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        
        default:
		return DefWindowProc( hwnd, msg, wParam, lParam );
    }
}


int okno(  )
{
   
   //MessageBox( NULL, "TEXT", "main", MB_OK | MB_ICONWARNING | MB_DEFBUTTON2 | MB_OKCANCEL );
   

    WNDCLASSEX wc;
   
   HWND hWin = GetActiveWindow();
  // HINSTANCE hInstance = GetWindowLong( hWin, GWL_HINSTANCE);
   
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc; //obsluga komunikatow
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = x;
    //(HINSTANCE)GetWindowLong( hWin, GWL_HINSTANCE);
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 ); //kolor tla
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "Nazwa_Klasy";
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
	wc.style = CS_DBLCLKS;
   
   
 //  RegisterClassEx( & wc );

    if( !RegisterClassEx( & wc ) )
    {

        return 2;
     
        
    }
  
    // TWORZENIE OKNA
       
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, "Nazwa_Klasy", "Nazwa_Okna", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, x, NULL );

    if( hwnd == NULL ) return 4;
    
    ShowWindow( hwnd, 1 ); // Pokaż okienko...
    UpdateWindow( hwnd );
    
    
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
    
}
        

ODPOWIEDZ