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

 
gchrmt4 :

오래된 Ansi 문자열 배열을 시뮬레이션하는 것은 지저분하지만 여전히 가능합니다. (특히 배열의 내용을 변경하여 데이터를 MQL4로 다시 전달하는 경우 DLL이 올바르게 작동하는지 여부에 따라 달라집니다. 더 현실적인 것이 아니라 맨 아래에 있는 예제 C++ 코드에 대해서만 테스트했습니다. MySql 라이브러리처럼.)

예를 들어 위의 코드는 배열의 각 문자열에 대해 메시지 상자를 수행한 다음 MT4로 돌아가기 전에 문자열을 뒤집는 다음 DLL과 함께 작동합니다.


귀하의 스니펫이 얼마나 도움이 되는지 설명할 수 없습니다. 정말 감사합니다! 나는 당신이 언급한 기술과 EAX MySQL 라이브러리 (MQL5)에서 찾은 기술을 사용하여 libmysql.dll(ANSI)과 통신하는 순수 MQL4(UNICODE 버전용)로 MySQL 래퍼를 작성했습니다.

거기에 있는 내 코드를 살펴 보고 개선할 수 있다고 확신하는 부분에 대해 개선하거나 기여할 수 있다면 정말 감사하겠습니다.

 

gchrmt4,

DLL 함수 호출을 통해 문자열을 전달하거나 샘플 코드를 알려주는 방법을 알려주시겠습니까?

내가 찾고 있는 것은 다음과 같은 통화를 할 수 있다는 확인입니다.

#수입

int call_a_string_function(문자열 this_is_a_string);

#수입

...

...

string foo1 = "이것은 문자열입니다";

int retruncode = call_a_string_function(foo1);

그렇다면 위의 함수에 대한 C 코드는 어떻게 생겼을까요? 나는 단지 일상적인 예를 찾고 있습니다.

int call_a_string_function(char *this_is_a_string);

어떤 사람들은 배열이나 char 배열 등을 사용한다고 말합니다. 나는 약간의 설명을 찾고 있습니다. 메모리 누수 등을 언급했듯이 최상의 접근 방식에 대한 간단한 샘플입니다.

문안 인사

고릭

 
gorick :

gchrmt4,

DLL 함수 호출을 통해 문자열을 전달하거나 샘플 코드를 알려주는 방법을 알려주시겠습니까?

내가 찾고 있는 것은 다음과 같은 통화를 할 수 있다는 확인입니다.

#수입

int call_a_string_function(문자열 this_is_a_string);

#수입

...

...

string foo1 = "이것은 문자열입니다";

int retruncode = call_a_string_function(foo1);

그렇다면 위의 함수에 대한 C 코드는 어떻게 생겼을까요? 나는 단지 일상적인 예를 찾고 있습니다.

int call_a_string_function(char *this_is_a_string);

어떤 사람들은 배열이나 char 배열 등을 사용한다고 말합니다. 나는 약간의 설명을 찾고 있습니다. 메모리 누수 등을 언급했듯이 최상의 접근 방식에 대한 간단한 샘플입니다.

문안 인사

고릭

이 기사를 참조하십시오 https://www.mql5.com/en/articles/18
 

네, 감사합니다. 정말 잘 제시되고 내가 기대했던 것. 그러나 문자열에 문제가 있는 것 같습니다.

나는 문자열 값을 입력으로 받아들이고 파일에 쓰기 위해 C로 그 문서에서 샘플을 만들었습니다.

 #define WIN32_LEAN_AND_MEAN
#include <windows.h>

#define EXPORT extern "C" __declspec (dllexport)

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
EXPORT void __stdcall GetStringValue(wchar_t *spar)
{
char abc[ 20 ];
strcpy(abc, "foooooooooooo1" );
printf ( "GetStringValue \"%s\"\n" ,spar);
FILE *fp;
fp=fopen( "fooerr.txt" , "w" );
fprintf(fp, "These are the string values: %s %s\n\n" , spar, abc);
fclose(fp);
}

나는 값을 확인 하기 위해 파일에 씁니다.

MQL은 다음과 같습니다.

 #property indicator_chart_window

#include <stderror.mqh>
#include <stdlib.mqh>

#import "myDLL.dll"

void GetStringValue( string instring);

#import

int init()
{

string instring = "Rick wrote this" ;

GetStringValue(instring);

return ( 0 );
} // init

파일 출력은 다음과 같습니다.

다음은 문자열 값입니다. R foooooooooooo1

전달된 문자열의 "R" 또는 첫 번째 문자만 반환합니까? 내가 올바르게 인쇄하고 있는지 확인하기 위해 "foooooooooooo1"이 삽입되었습니다.

아무도 내가 뭘 잘못하고 있는지 알고 있습니까?

 
gorick :

네, 감사합니다. 정말 잘 제시되고 내가 기대했던 것. 그러나 문자열에 문제가 있는 것 같습니다.

문자열 값을 입력으로 받아들이고 파일에 쓰기 위해 C에서 해당 문서의 샘플을 만들었습니다(예: 아래).

<제거됨>

SRC 버튼사용하여 코드를 게시하십시오. . .
 
gorick :

아무도 내가 뭘 잘못하고 있는지 알고 있습니까?

문제는 MQL4가 아니라 C 코드에 있습니다.

printf()의 %s는 "Ansi 문자열"을 의미합니다. %ls을(를) 사용해야 합니다.

 
gorick :

네, 감사합니다. 정말 잘 제시되고 내가 기대했던 것. 그러나 문자열에 문제가 있는 것 같습니다.

문자열 값을 입력으로 받아들이고 파일에 쓰기 위해 C에서 해당 문서의 샘플을 만들었습니다(예: 아래).

나는 값을 확인하기 위해 파일에 씁니다.

MQL은 다음과 같습니다.

파일 출력은 다음과 같습니다.

다음은 문자열 값입니다. R foooooooooooo1

전달된 문자열의 "R" 또는 첫 번째 문자만 반환합니까? 내가 올바르게 인쇄하고 있는지 확인하기 위해 "foooooooooooo1"이 삽입되었습니다.

아무도 내가 뭘 잘못하고 있는지 알고 있습니까?


여보세요,

코드를 게시할 때 SRC 버튼을 사용하십시오. 고맙습니다.


이번에는 여러분을 위해 편집했습니다.

 
angevoyageur :

여보세요,

코드를 게시할 때 SRC 버튼을 사용하십시오. 고맙습니다.


이번에는 여러분을 위해 편집했습니다.


죄송합니다. 여기에 게시하는 것은 정말 새롭습니다.

입력해 주셔서 감사합니다. 정말 감사합니다.

이것이 의미하는 바는 모든 기존 샘플이 정확하지 않다는 것입니다. 유니코드를 사용해야 합니다. 저는 DLL 프로그래밍에 매우 익숙하기 때문에 최근에 처음부터 시작했기 때문에 주어진 샘플에 크게 의존했습니다. 또한 우연히 600 빌드를 동시에 사용하기 시작했습니다.

오랫동안 이 일을 해왔다면 상황을 완전히 알고 있다고 생각합니다. 저는 불행히도 그렇지 않습니다. 이 포럼에서 정보와 조언의 스니펫만 얻고 있습니다.

제 무지에 대해 사과드립니다.

안부 및 감사

 
사람들,

여러분 모두가 저를 도왔기 때문에 Oracle DB에 연결하는 제 코드를 공유하게 되어 기쁩니다.

문제는 Oracle Pro*C 사전 컴파일러 및 Oracle이 유니코드를 처리할 수 있지만 구문을 사용할 수 있는 위치에 제한이 있다는 것입니다. 로그인하려면 문자열이 ASCII여야 합니다. 다음은 DLL 호출에서 DB에 로그인하는 코드입니다.

누구든지 더 잘할 수 있는 방법에 대한 제안이 있으면 알려주십시오.

다시 한번 감사드립니다.

EXPORT int   __stdcall oracle_connect( char *connect1[], char *connect2[], char *connect3[])
{
   EXEC SQL BEGIN DECLARE SECTION;
   VARCHAR     username[UNAME_LEN];   /* VARCHAR is an Oracle-supplied struct */
   varchar     password[PWD_LEN];     /* varchar can be in lower case also. */
   varchar     dbstring[DBSTRING_LEN];
   EXEC SQL END DECLARE SECTION;

   /* Connect to ORACLE--
    * Copy the username into the VARCHAR.
    * Set the length component of the VARCHAR.
    
    strncpy((char *) username.arr, connect1, UNAME_LEN);
    username.len = strlen((char *) username.arr);
    strncpy((char *) password.arr, connect2, PWD_LEN);
    password.len = strlen((char *) password.arr);
    strncpy((char *) dbstring.arr, connect3, DBSTRING_LEN);
    dbstring.len = strlen((char *) dbstring.arr);
        
        EXEC SQL WHENEVER SQLERROR DO return(sqlca.sqlcode);
        EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbstring; 

/*    printf("\n\nConnected to ORACLE as user: %s\n", username.arr); */

     return ( 0 );
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

MQL4 code

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

extern string DBusername = "scott" ;
extern string DBpassword = "tiger" ;
extern string DBservice = "localhost/pdborcl" ;

int returncode;

int init()
{
   uchar user_name[], user_pwd[], db_service[];
   StringToCharArray (DBusername,user_name);
   StringToCharArray (DBpassword,user_pwd);
   StringToCharArray (DBservice,db_service);
  returncode = oracle_connect(user_name,user_pwd,db_service);
   Print ( "returncode = " + returncode);
}

 
gorick :
사람들,

여러분 모두가 저를 도왔기 때문에 Oracle DB에 연결하는 제 코드를 공유하게 되어 기쁩니다.

문제는 Oracle Pro*C 사전 컴파일러 및 Oracle이 유니코드를 처리할 수 있지만 구문을 사용할 수 있는 위치에 제한이 있다는 것입니다. 로그인하려면 문자열이 ASCII여야 합니다. 다음은 DLL 호출에서 DB에 로그인하는 코드입니다.

누구든지 더 잘할 수 있는 방법에 대한 제안이 있으면 알려주십시오.

다시 한번 감사드립니다.

gorkk 정말 감사합니다!
사유: