- 2010.05.26
- Andrey Voytenko
- www.mql5.com
Да, я понял, сделал выделение StringInit в MQL, а в Delphi написал StrCat + убрал var. Спасибо.
Может быть не совсем уместный вопрос, но как в таком случае можно осуществлять вызов этой же функции из программы на C++, если выходной параметр в C++ объявлен как wchar_t*.
То есть:
// Объявление typedef bool (__stdcall *t_get_data) (wchar_t* &p_text); // Вызов wchar_t *lv_fin_list; // Здесь нужно инициализировать lv_fin_list, но как? m_get_data(lv_fin_list);
Точнее интересует как сделать что-то подобное StringInit(lv_text, 100, 0) в C++?
Заранее благодарен.
wchar_t *lv_fin_list = new wchar_t[255];
Попробовал. После вызова dll-функции в отладчике строка = <Bad ptr>.
Может быть что-то еще нужно выполнить?
Если в DLL передается юникод строка, то тип данных должен быть PWideChar.
function m_get_data(const p_text: PWideChar): boolean; stdcall;
- www.mql5.com
У меня Delphi XE2, там PChar = PWideChar, но я все-таки попробовал то, что вы посоветовали, результат такой же :(
Что-то еще можно сделать?
Delphi DLL
library Project2; uses Windows; function m_get_data(p_text: PWideChar): boolean; stdcall; var AnsiStr: AnsiString; begin AnsiStr:= 'Transmitted wide string';//наша строка MultiByteToWideChar(CP_ACP, 0, @AnsiStr[1], Length(AnsiStr), p_text, Length(AnsiStr)*2); end; exports m_get_data; begin end.
Visual Studio Console application
#include <windows.h> #include <tchar.h> #include <stdio.h> // тип указателя на функцию typedef bool (__stdcall *m_get_data) (wchar_t* p_text); int _tmain(int argc, _TCHAR* argv[]) { HMODULE hDll = LoadLibraryA("Project2.dll"); //указатель на функцию m_get_data m_get_data ProcAddr = NULL; if( hDll != NULL ) { // получение адреса функции ProcAddr = (m_get_data) GetProcAddress(hDll, "m_get_data"); if(ProcAddr != NULL ) { // инициализация буфера wchar_t *lv_fin_list = new wchar_t[255]; // вычищаем мусор ZeroMemory(lv_fin_list,255*sizeof(wchar_t)); // вызов функции (ProcAddr)(lv_fin_list); // вывод результата wprintf(lv_fin_list); // удаление буфера delete [] lv_fin_list; } FreeLibrary(hDll); } getchar(); return 0; }Result
MQL5 Script
#import "Project2.dll" bool m_get_data(string &data); #import //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { string data; StringInit(data,255); m_get_data(data); Print(data); } //+------------------------------------------------------------------+
Result
2012.04.19 18:45:42 StringDLL (EURUSD,H1) Transmitted wide string
Delphi DLL
Visual Studio Console application
Result
Спасибо Андрей, за такие ответы. Вы редкое исключение из числа профи. Была бы кнопочка, повышающая Ваш рейтинг, я бы нажал ее даже, если бы с моего рейтинга улетучилась эквивалентная сумма. Такие ответы достойны этого
Вот и сделайте предложение MQ по развитию сообщества.
Типа прикрутить возможность отдавать свой рейтинг за толковые ответы.
Спасибо Андрей, за такие ответы.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте,
Имеется dll, написанная на Delphi. В ней функция типа:
Есть скрипт, в котором эта функция определена вот так:
Вызываю эту функцию в скрипте вот так:
string lv_text; get_data(lv_text);
Однако в переменной lv_text в результате абракадабра.
Далее переделал функцию в Delphi вот так:
Соответственно исправил описание в скрипте и все заработало как надо.
Почему когда я передаю строку как параметр и возвращаю ее, то результатом является абракадабра, а когда в качестве результата функции, то все в порядке?