DLL 문자열 기능은 Build 600에서 작동하지 않습니다. - 페이지 3

 
#import "MT4iQuickChannel.dll"
   int QC_StartSender( string );
   int QC_ReleaseSender( int );
   int QC_SendMessage( int SenderHandle, string Message, int Flags);
#import

#import "kernel32.dll"
   void OutputDebugStringW( string msg);
#import

extern string   ChannelName = "QuickChannelTest" ;
extern bool     LogMessagesToDbgView = true ;
int glbHandle = 0 ;

void init()
{
   glbHandle = QC_StartSender(ChannelName);
   if (glbHandle == 0 ) {
       Alert ( "Failed to get a QuickChannel sender handle" );
   }
}

void deinit()
{
   QC_ReleaseSender(glbHandle);
   glbHandle = 0 ;
}

void start()
{
   if (glbHandle != 0 ) {
       string strMsg = StringConcatenate ( "我的天哪"   , TimeToStr ( TimeLocal (), TIME_SECONDS ), ": " , Symbol () , "," , DoubleToStr ( Bid , MarketInfo ( Symbol (), MODE_DIGITS )) , "," , DoubleToStr ( Ask , MarketInfo ( Symbol (), MODE_DIGITS )));
       if (LogMessagesToDbgView) OutputDebugStringW( "Message " + strMsg);
       int result = QC_SendMessage(glbHandle, strMsg, 0 );
       if (result == 0 ) Alert ( "QuickChannel message failed" );
       printf (strMsg);
   }     
}   
#import "MT4iQuickChannel.dll"
   int QC_StartReceiver( string , int );
   int QC_ReleaseReceiver( int );
   int QC_GetMessages3( int , string & arr[], int );
#import

#import "kernel32.dll"
   void OutputDebugStringW( string msg);
#import

extern string   ChannelName = "QuickChannelTest" ;
extern bool     LogMessagesToDbgView = true ;

int glbHandle = 0 ;
string glbReceiveBuffer = "" ;

void init()
{
   glbReceiveBuffer = "12345678" ;
   for ( int i = 0 ; i < 4 ; i++) glbReceiveBuffer = StringConcatenate (glbReceiveBuffer, glbReceiveBuffer);   
}

void deinit()
{
   QC_ReleaseReceiver(glbHandle);
   glbHandle = 0 ;
}

void start()
{

   if (glbHandle == 0 ) {
      glbHandle = QC_StartReceiver(ChannelName, WindowHandle ( Symbol (), Period ()));
   
       if (glbHandle == 0 ) {
         Alert ( "Failed to get a QuickChannel receiver handle" );
      }
   }

   if (glbHandle != 0 ) {
       string arrBuffer[ 1 ];
      arrBuffer[ 0 ] = StringConcatenate (glbReceiveBuffer, "" ); // Use copy of buffer template
       int res = QC_GetMessages3(glbHandle, arrBuffer, StringLen (arrBuffer[ 0 ]));
      
       if (res == 2 ) {
         Alert ( "QuickChannel buffer is not large enough!" );
                     
      } else if (res == 1 ) {
               
      } else {
         string strMsgList = arrBuffer[ 0 ];

         if (strMsgList != "" ) {
         
             string Messages[];
             StringSplit (strMsgList, "\t" , Messages);
         
             for ( int i = 0 ; i < ArraySize (Messages); i++) {
               string strMsg = Messages[i];

               if (LogMessagesToDbgView) OutputDebugStringW( "..." + strMsg);
         
               Comment (strMsg);
               Print (strMsg);
 }  }  } }}   

void StringSplit ( string InputString, string Separator, string & ResultArray[])
{
   ArrayResize (ResultArray, 0 );
   
   int lenSeparator = StringLen (Separator), NewArraySize;
   while (InputString != "" ) {
       int p = StringFind (InputString, Separator);
       if (p == - 1 ) {
         NewArraySize = ArraySize (ResultArray) + 1 ;
         ArrayResize (ResultArray, NewArraySize);      
         ResultArray[NewArraySize - 1 ] = InputString;
         InputString = "" ;
      } else {
         NewArraySize = ArraySize (ResultArray) + 1 ;
         ArrayResize (ResultArray, NewArraySize);      
         ResultArray[NewArraySize - 1 ] = StringSubstr (InputString, 0 , p);
         InputString = StringSubstr (InputString, p + lenSeparator);
         if (InputString == "" ) {
             ArrayResize (ResultArray, NewArraySize + 1 );      
            ResultArray[NewArraySize] = "" ;
 }  }  }}
안녕, 코더, 이것은 MT4iQuickChannel.dll 발신자-수신자 메시지 예입니다. mt4 v509에서는 작동했지만 v600+에서는 작동하지 않습니다. 문제가 16비트 유니코드에 관한 것임을 알고 있지만 해결할 수 없으므로 모든 사람이 할 수 있습니다. 도와 줘요?
 
이것은 코드이며 두 개의 MT에 설치하고 두 개의 터미널 과 통신하는 데 사용합니다.
파일:
 
appleparty :
이것은 코드이며, 두 개의 MT에 설치하고 두 개의 터미널과 통신하는 데 사용합니다.

애플파티 정말 감사합니다!
 

당신을 환영합니다. 코드는 v600+에서 작동하지 않으므로 문제를 해결하는 방법을 알려주실 수 있다면 대단히 감사합니다!

 

@고릭:

ORACLE DB에 연결하는 것이 좋습니다! 그러나 mql4를 사용하여 ORACLE에서 어떻게 읽고 쓰나요?

그리고 어디서 oraDLL.dll을 얻었습니까?


미리 THX!


남자 이름

 

m.mick과 같은 질문이 있습니다.

oraDLL.dll은 어디에서 다운로드할 수 있으며 ORACLE-DB로 읽고 쓰는 것은 어떻게 구현됩니까?

나를 도와주는 THX 4!

 
m.mick :

@고릭:

ORACLE DB에 연결하는 것이 좋습니다! 그러나 mql4를 사용하여 ORACLE에서 어떻게 읽고 쓰나요?

그리고 어디서 oraDLL.dll을 얻었습니까?

미리 THX!

남자 이름

믹,

내가 제공한 것은 Oracle Pro*C 프리컴파일러를 사용하는 코드 조각입니다. EXEC SQL CONNECT와 동일합니다. 아래 샘플을 보십시오. 코드를 작성한 다음 함수 호출에서 DLL의 일부로 컴파일하는 C 코드를 생성하는 Oracle Pro*C 사전 컴파일러를 통해 이를 실행합니다. 이를 수행하려면 Oracle에 대해 알아야 하고 사전 컴파일러를 포함하여 Oracle DB 및 클라이언트 소프트웨어를 가져와야 합니다. 나는 아주 오랫동안 oracle을 사용해 왔으며 단순히 익숙하기 때문에 다른 모든 사람들보다 그것을 선호합니다.

행운을 빕니다.

    EXEC SQL WHENEVER NOT FOUND DO sql_error( "ORACLE error--\n" );

    EXEC SQL SELECT 'Col1' , 'Col2'
             INTO :stringrec INDICATOR :string_ind /* note insert into array variable */
             FROM    dual
             WHERE   :bindval1 = :bindval1
             AND     :string1 = :string1;

Oracle Pro*C 사전 컴파일러는 기본 API인 OCI - Oracle Call Interface 를 사용 하여 Oracle과 인터페이스 하기 위해 위에서 C 코드 생성합니다.

 
gorick :

믹,

내가 제공한 것은 Oracle Pro*C 프리컴파일러를 사용하는 코드 조각입니다. EXEC SQL CONNECT와 동일합니다. 아래 샘플을 보십시오. 코드를 작성한 다음 함수 호출에서 DLL의 일부로 컴파일하는 C 코드를 생성하는 Oracle Pro*C 사전 컴파일러를 통해 이를 실행합니다. 이를 수행하려면 Oracle에 대해 알아야 하고 사전 컴파일러를 포함하여 Oracle DB 및 클라이언트 소프트웨어를 가져와야 합니다. 나는 아주 오랫동안 oracle을 사용해 왔으며 단순히 익숙하기 때문에 다른 모든 사람들보다 그것을 선호합니다.

행운을 빕니다.

Oracle Pro*C 사전 컴파일러는 기본 API인 OCI - Oracle Call Interface 를 사용 하여 Oracle과 인터페이스 하기 위해 위에서 C 코드 생성합니다.


32비트 버전의 Oracle Instant Client가 필요하다는 사실을 잊어버렸습니다. http://www.oracle.com/technetwork/topics/winsoft-085727.html, 64비트는 MetaTrader 플랫폼에서 작동하지 않습니다. . DB는 64비트 버전일 수 있습니다. Oracle을 알아야 합니다. Oracle은 복잡한 소프트웨어입니다. 무료로 개발할 수 있습니다. Oracle에 등록하기만 하면 됩니다. 등록은 무료입니다. 모든 Oracle 다운로드는 무료입니다.
 

고릭:

네, 맞습니다. ORACLE은 복잡한 소프트웨어입니다. 나는 몇 년 동안 ORACLE과 함께 일했는데(그러나 SQL과 PL/SQL만), 이것이 최고의 데이터베이스입니다. 불행히도 저는 Pro*C 컴파일러나 DLL로 개발하지 않았습니다. 그래서 제가 하기가 상당히 어렵습니다. 하지만 난 노력할거야! :-)

당신의 훌륭한 작품에 대해 몇 가지 질문이 있습니다.

 #import "oraDLL.ex4"
   int     oracle_connect( uchar user_name[], uchar user_pwd[], uchar db_service[]);
#import

컴파일(빌드 610)하려고 하면 "배열은 참조로만 전달됨"과 같은 오류 메시지가 나타납니다. 왜요? 어떻게 해야 하나요? 문자열이 아닌 uchar[]를 사용한 이유는 무엇입니까? Pro*C-Compiler 때문일까요?

DLL은 어떻게 개발했나요? MT4에서도? 메타에디터에서 컴파일 후 *.ex4-File을 받습니다.... .

Pro*C 프리컴파일러에서 .c 파일을 받은 경우 해당 파일을 어떻게 처리해야 합니까? 해당 코드로 DLL을 어떻게 개발하거나 생성합니까?


Oracle Instant Client는 oraDLL을 사용해야 하는 모든 클라이언트에 필수입니다. 권리?


미리 THX!!!

 

ORACLE Pro*C Compiler를 사용하면 생성된 코드를 dll에 삽입한 후 많은 오류가 발생합니다.

다음은 dll을 컴파일한 후의 몇 가지 문제입니다.

- UNAME_LEN, PWD_LEN 및 DBSTRING_LEN 선언이 누락되었습니다.

- EXPORT 가 올바른 단어입니다. 오류가 발생합니다. extern이 옳은 표현이 아닙니까?

- connect1(및 2 및 3)은 다른 유형입니다. 선언에서 char ** 및 사용법(strncpy)에서만 char *; 더 이상 사용되지 않으며 strncpy_s를 사용해야 합니다.

- sqlca가 선언되지 않음

- ...


아무도 도와주세요?


미리 THX,

남자 이름

사유: