Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Хочешь написать торгового робота? Загляни в Справочник MQL5!
Sergey Sartakov
1286
Sergey Sartakov 2011.03.02 15:48 

Если DLL-функция возвращает указатель на строку,

могу я при импорте определить ее прототип как:

string dllfunction(...),


а потом в теле MQL-программы написать:

string pBuf = dllfunction(...);

??????????????????

Игорь
157
Игорь 2011.03.02 16:50  
Мда, а заглянуть в папку ..\experts\samples\DLLSample\.. своего терминала и просмотреть не сложный код примера не судьба?
Sergey Sartakov
1286
Sergey Sartakov 2011.03.02 17:12  
OneDepo:
Мда, а заглянуть в папку ..\experts\samples\DLLSample\.. своего терминала и просмотреть не сложный код примера не судьба?

Вы говорите об этом -

MT4_EXPFUNC char* __stdcall GetStringValue(char *spar)
  {
   printf("GetDoubleValue takes \"%s\"\n",spar);
   return(spar);
  }


А если я вызываю напрямую функцию:
#import "kernel32.dll"
 
int CreateFileMappingW
(
   int hFile,              // INVALID_HANDLE_VALUE - use paging file
   int lpAttributes,       // NULL - default security
   int flProtect,          // PAGE_READWRITE - read/write access
   int dwMaximumSizeHigh,  // maximum object size (high-order DWORD) - 0
   int dwMaximumSizeLow,   // maximum object size (low-order DWORD)  - BUF_SIZE
   string szName           // name of mapping object
);
 
string  MapViewOfFile
(
   int  hFileMappingObject,        // handle to map object
   int  dwDesiredAccess,           // FILE_MAP_ALL_ACCESS, - read/write permission  
   int  dwFileOffsetHigh,          // 0
   int  dwFileOffsetLow,           // 0
   int  dwNumberOfBytesToMap       // BUF_SIZE
);

#import
#define INVALID_HANDLE_VALUE   -1
#define PAGE_READWRITE       0x04
#define STANDARD_RIGHTS_REQUIRED     0x000F0000
#define SECTION_QUERY                0x0001
#define SECTION_MAP_WRITE            0x0002
#define SECTION_MAP_READ             0x0004
#define SECTION_MAP_EXECUTE          0x0008
#define SECTION_EXTEND_SIZE          0x0010
#define BUF_SIZE 256
string  szName = "Global\\MyFileMappingObject";
string  szMsg =  "Message from first process.";

int init()
{
   int FILE_MAP_ALL_ACCESS =   STANDARD_RIGHTS_REQUIRED | SECTION_QUERY |
                            SECTION_MAP_WRITE |     
                            SECTION_MAP_READ |      
                            SECTION_MAP_EXECUTE |   
                            SECTION_EXTEND_SIZE;
//---
   int    hMapFile;
   string pBuf;

   hMapFile = CreateFileMappingW(
                 INVALID_HANDLE_VALUE,    // use paging file
                 NULL,                    // default security
                 PAGE_READWRITE,          // read/write access
                 0,                       // maximum object size (high-order DWORD)
                 BUF_SIZE,                // maximum object size (low-order DWORD) 
                 szName);                 // name of mapping object

   if (hMapFile == NULL)
   {
      Print("Could not create file mapping object... ");
      return(1);
   }
   else
   Print("file mapping object handle =  ",hMapFile);

  
   pBuf = MapViewOfFile(hMapFile,            // handle to map object
                        FILE_MAP_ALL_ACCESS, // read/write permission
                        0,                  
                        0,                  
                        BUF_SIZE);          
 
/*   if (pBuf == " ")
   {
      Print("Could not map view of file..." );
//      CloseHandle(hMapFile);
      return(1);
   } */
   pBuf = szMsg;
   return(0);
}//+------------------------------------------------------------------+
.....
Получу я в переменной
pBuf   нужную мне shared - строку ?
Впрочем, напишу сейчас второй процесс и все прояснится.
Игорь
157
Игорь 2011.03.02 17:29  
Первый пост был мною воспринят как вопрос по написанию собственной DLL. Если же говорить о вызове API функций, то нужно пробовать.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий