czy ktos moze wie jak powinienem w C++ odebrac string z MT4?
chce z poziomu C++ wywolac MessageBox z napisem ze stringa z MT4. wszystko jest ok, tylko stringa nie moge przeslac. Jesli mam tak:
funkcja w C++: void Hello(char* k){MessageBoxA}
w MT4 zadeklarowana jako: void Hello(string s);
to wywolanie w MT4: s="cos tam"; Hello(s)
powoduje ze ze stringa s w komunikacie MsgBoxA mam tylko litere (jesli s jest jednoliterowe) lub nic(jesli s jest dluzsze), uzywam MessageBoxA zeby moc odebrac char*, bo MessageBox chce LPCWSTR
na razie nie bardzo wiem jak rozwiazac ta konwersje ze stringa MT4 na "cos" w C++ tak zeby potem z tego "cos" ladnie wywolac MsgBox, BoxA lub BoxW
moze ktos juz sie z tym uporal? string w MT4 jest jakas struktura(struct)?
MT4 string = C++ ...
Dziwne ...
Ja mam na przykład deklaracje w dll :
Deklaracje w MQL :
I wszystkie stringi są przekazywane poprawnie .
Debugerem nie możesz podejrzeć co wpada do fun ?
Funkcje w dll muszą mieć odpowiednią konwencję wywołania
inaczej się sypie ,przedstawiona przez ciebie deklaracja nie jest poprawna dla biblioteki dll .
Miejsce wstawienia __declspec(dllexport) zależne od kompilatora .
String mql jako parametr funkcji C odpowiada LPCSTR == const char* (non unicode).
Tu masz przykłady :
http://www.forex.nawigator.biz/dyskusje ... php?t=3764
w:
Ja mam na przykład deklaracje w dll :
Kod: Zaznacz cały
//----------------------------------------------------------------------------
extern "C"
{
bool __declspec(dllexport) __stdcall QSendStr(LPCSTR,LPCSTR);
bool __declspec(dllexport) __stdcall QSendSignBuff(LPCSTR,int offset,double d[],int size);
bool __declspec(dllexport) __stdcall QInitServer(void);
bool __declspec(dllexport) __stdcall QDeInitServer(void);
bool __declspec(dllexport) __stdcall QOrderSend(int,LPCSTR,double*);
bool __declspec(dllexport) __stdcall QOrderRet(int,LPCSTR,int);
bool __declspec(dllexport) __stdcall QOrderTrades(LPCSTR,int Index ,double*,int size);
int __declspec(dllexport) __stdcall QOrderClose(LPCSTR);
bool __declspec(dllexport) __stdcall QOrdersDisabled(LPCSTR);
bool __declspec(dllexport) __stdcall QOrdersEnabled(LPCSTR,int);
bool __declspec(dllexport) __stdcall QReadSettings(LPCSTR,double*,double*);
bool __declspec(dllexport) __stdcall QReadSettingsEx(LPCSTR,double*,int);
}
Kod: Zaznacz cały
#import "qsrvex2.dll"
bool QSendStr(string,string) ;
bool QSendSignBuff(string,int,double d[],int);
bool QOrderSend(int,string,double o[]);
bool QOrderRet(int,string,int);
bool QOrderTrades(string,int,double d[],int size);
int QOrderClose(string);
bool QOrdersDisabled(string);
bool QOrdersEnabled(string,int);
bool QReadSettings(string,double d1[],double d2[]);
bool QReadSettingsEx(string,double d[],int);
bool QInitServer();
#import
Debugerem nie możesz podejrzeć co wpada do fun ?
Funkcje w dll muszą mieć odpowiednią konwencję wywołania
Kod: Zaznacz cały
__stdcall
Miejsce wstawienia __declspec(dllexport) zależne od kompilatora .
String mql jako parametr funkcji C odpowiada LPCSTR == const char* (non unicode).
Tu masz przykłady :
http://www.forex.nawigator.biz/dyskusje ... php?t=3764
w:
Problemem może być też UNICODE , raczej nie ma potrzeby wywoływania jawnego msboxA .Projekt powinien być skompilowany jako non unicode , kompilator sam dobierze prototyp funkcji .Create your own MetaTrader extension (dll) - Part 1
Create your own MetaTrader extension (dll) - Part 2..
Nie spiesz się , zawsze zdążysz stracić .
- f16_rocket
- Stały bywalec
- Posty: 56
- Rejestracja: 09 wrz 2011, 01:54
- f16_rocket
- Stały bywalec
- Posty: 56
- Rejestracja: 09 wrz 2011, 01:54
VS2010
Juz naprawione. Zmienilem jednak od razu kilka rzeczy, w tym opcje znakow dla projektu z Multi-byte na No Set(to chyba to), wiec nie moge powiedziec co bylo przyczyna bug-u. Teraz nie mam juz czasu, ale pozniej sprawdze i obiecuje poinformowac. dzieki dulf.
Juz naprawione. Zmienilem jednak od razu kilka rzeczy, w tym opcje znakow dla projektu z Multi-byte na No Set(to chyba to), wiec nie moge powiedziec co bylo przyczyna bug-u. Teraz nie mam juz czasu, ale pozniej sprawdze i obiecuje poinformowac. dzieki dulf.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
- f16_rocket
- Stały bywalec
- Posty: 56
- Rejestracja: 09 wrz 2011, 01:54
chyba tak, ale sprawdze to jeszcze potem.
--------------
no wiec tak. ustawienia znakow projektu musza byc albo Not set albo Multi-byte. to wszystko.
jeszcze tylko w tym warningu nie wiem o co chodzi:
FXdeltaMT4DLL.exp : warning LNK4070: /OUT:FXdeltaDLL.dll directive in .EXP differs from output filename 'C:\Documents and Settings\Moje dokumenty\Visual Studio 2010\Projects\FXdeltaDLL\Debug\FXdeltaMT4DLL.dll'; ignoring directive
--------------
no wiec tak. ustawienia znakow projektu musza byc albo Not set albo Multi-byte. to wszystko.
jeszcze tylko w tym warningu nie wiem o co chodzi:
FXdeltaMT4DLL.exp : warning LNK4070: /OUT:FXdeltaDLL.dll directive in .EXP differs from output filename 'C:\Documents and Settings\Moje dokumenty\Visual Studio 2010\Projects\FXdeltaDLL\Debug\FXdeltaMT4DLL.dll'; ignoring directive
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Nie wiem co ten warn oznacza bo nie używam Visual S . Możesz zapytać na
http://forum.4programmers.net/
http://forum.4programmers.net/
Nie spiesz się , zawsze zdążysz stracić .