Build 600でDLL文字列関数が動作しない。 - ページ 2

 
gchrmt4:

古いAnsi文字列配列をシミュレートするのは面倒ですが、まだ可能です。(これはDLLがうまく動作するかどうかによります。特に、配列の内容を変更することでMQL4にデータを渡す 場合はそうです。このテストは一番下にあるサンプルのC++コードに対してのみ行い、MySqlライブラリのようなより現実的なものに対しては行っていません)。

例えば、上記のコードは、配列の各文字列に対してメッセージボックスを行い、MT4に返す前に文字列を反転させる次のDLLで動作します。


あなたのスニペットがどれほど役に立つか、説明することができません。本当にありがとうございます。私は、あなたが言った技術とEAX MySQLライブラリ(MQL5)で見つけた技術を使って、libmysql.dll(ANSI)と通信する純粋なMQL4(UNICODE版)でMySQLラッパーを 書きました。

私のコードをご覧いただき、改善すべき点についてお知らせ いただくか、あるいは、間違いなく改善できると思いますので、それに貢献して いただけると本当にありがたいです。

 

gchrmt4です。

DLLの関数 呼び出しで文字列を渡す方法、またはサンプルコードを教えていただけませんか?

私が求めているのは、次のような呼び出しができるかどうかの確認です。

#import

int call_a_string_function(string this_is_a_string);

#import

...

...

string foo1 = "this is a string";

int retruncode = call_a_string_function(foo1);

とすると、上記の関数のCコードはどのようなものになるのでしょうか?私はルーチンの例を探しているだけです。

int call_a_string_function(char *this_is_a_string);

など

ある人は、配列またはchar配列などを使用するようにと言います。私はいくつかの明確化を探しています。メモリリークなどにも言及されているので、最適な方法について簡単なサンプルでいいので教えてください。

よろしくお願いします。

ゴーリック

 
gorick:

gchrmt4です。

DLLの関数呼び出しで文字列を渡す方法、またはサンプルコードを教えていただけませんか?

私が求めているのは、次のような呼び出しができるかどうかの確認です。

#import

int call_a_string_function(string this_is_a_string);

#import

...

...

string foo1 = "this is a string";

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 foooooooo1

これは、渡された文字列の "R "または最初の文字だけを返すのですか?foooooooo1 "は、私が正しく印刷していることを確認するためだけに挿入されました。

どなたか、私が何を間違えているのか、お分かりになる方はいらっしゃいますか?

 
gorick:

はい、ありがとうございます。本当によくまとまっていて、期待していた通りです。しかし、文字列については問題があるようです。

私はそのドキュメントからCで、例えば以下のように、文字列の値を入力として受け取り、それをファイルに書き出すサンプルを作りました。

<removed>

コードを投稿するにはSRCボタンを 使用してください.. .
 
gorick:

何が間違っているのか、どなたかおわかりになりますか?

問題はあなたのCコードにあり、MQL4にはありません。

printf()の%sは "Ansi文字列 "を意味します。lsを使用する必要があります。

 
gorick:

はい、ありがとうございます。本当によくまとまっていて、期待していた通りです。しかし、文字列については問題があるようです。

私はそのドキュメントから、例えば以下のような、文字列の値を入力として受け取り、それをファイルに書き込むサンプルをCで作成しました。

値をファイルに書き込んで確認しています。

MQLは以下の通りです。

ファイルの出力は以下の通りです。

これらは文字列の値です。R foooooooo1

これは、渡された文字列の "R "または最初の文字だけを返すのですか?foooooooo1 "は、私が正しく印刷していることを確認するためだけに挿入されました。

何が間違っているのか、どなたかおわかりになりますか?


こんにちは。

コードを投稿するときは、SRCボタンを使ってください。ありがとうございます。


今回は、私が編集してみました。

 
angevoyageur:

こんにちは。

コードを投稿するときは、SRCボタンを使ってください。ありがとうございます。


今回は、私が編集させていただきました。


申し訳ありません、ここに投稿するのは本当に初めてなんです。

あなたの意見、本当にありがとうございます。

これは何を意味するかというと、既存のサンプルはすべて正確ではないということです。一つはunicodeを使用しなければならない。私はDLLのプログラミングはつい最近ゼロから始めた超初心者なので、与えられたサンプルに大きく依存しました。 また、たまたま600ビルドを使い始めた時期も同じでした。

長くやっておられる方は、完全に状況を把握しておられると思うのですが。私は残念ながらそうではなく、このフォーラムで断片的な情報やアドバイスを得るだけです。

私の無知をお詫びします。

よろしくお願いします。

 
人です。

みなさんが助けてくれたので、Oracle DBへの接続を行う私のコードを共有させていただきます。

問題は、Oracle Pro*CプリコンパイラとOracleはunicodeを扱うことができますが、その構成が使用できる場所に制限があることです。ログインするためには、文字列はアスキーでなければなりません。以下は、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はunicodeを扱うことができますが、その構成が使用できる場所に制限があることです。ログインするためには、文字列はアスキーでなければなりません。以下は、DLL呼び出しからDBにログインするコードです。

もし、もっと良い方法があれば、私に教えてください。

私は再びあなたに感謝します。

gorkk さん、ありがとうございました。