Build 600でDLL文字列関数が動作しない。 - ページ 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の送信者と受信者のメッセージの例 です。
 
これは、2つのMTにインストールし、2つのターミナルと 通信するために使用するコードです。
ファイル:
 
appleparty:
これは、2つのMTにインストールして、2つの端末で通信するために使うコードです。

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

v600+では動作しないので、解決方法を教えてください。

 

@gorickです。

ORACLE DBに接続するのは素晴らしい仕事だ!でも、mql4でORACLEから/への読み書きはどうやるんですか?

それと、oraDLL.dllはどこから入手されたのですか?


よろしくお願いします。


マイケル

 

m.mickさんと同じ質問をさせていただきます。

どこでoraDLL.dllをダウンロードすることができますし、どのようにORACLE - DBとの読み取りと書き込みのimplemenationは何ですか?

私を助けるTHX 4

 
m.mick:

@gorickです。

ORACLE DBに接続するのは素晴らしい仕事だ!でも、mql4でどうやってORACLEから/ORACLEへ読み書きしているのですか?

また、oraDLL.dll はどこから入手されたのでしょうか?

よろしくお願いします。

マイケル

m.mickです。

私が与えたものは、Oracle Pro*C precompilerを使用したコードスニペットです。EXEC SQL CONNECTと同じです。下のサンプルを見てください。コードを書いて、これをOracle Pro*Cプリコンパイラで実行すると、Cコードが生成され、それをDLLの関数 呼び出しの一部としてコンパイルすることができます。この作業を行うには、Oracleの知識が必要で、プリコンパイラを含むOracle DBとClientソフトウェアを入手する必要があります。私は長い間オラクルを使っていますが、単に慣れているという理由で、他のどの製品よりもオラクルを好んで使っています。

頑張ってください。

    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プリコンパイラは、上記から Cコードを生成し、OCI - Oracle Call Interface、そのネイティブAPIを使用して オラクルとインターフェイス します。

 
gorick:

m.mickです。

私があげたのは、Oracle Pro*C precompilerを使ったコードスニペットです。EXEC SQL CONNECTと同じです。下のサンプルを見てください。あなたはコードを書き、これをOracle Pro*Cプリコンパイラで実行してCコードを生成し、それをDLLの関数呼び出しの一部としてコンパイルします。この作業を行うには、Oracleの知識が必要で、プリコンパイラを含むOracle DBとClientソフトウェアを入手する必要があります。私は長い間オラクルを使っていますが、単に慣れているという理由で、他のどの製品よりもオラクルを好んで使っています。

頑張ってください。

Oracle Pro*Cプリコンパイラは、上記から Cコードを生成し、OCI - Oracle Call Interface、そのネイティブAPIを使用して オラクルとインターフェイス します。


書き忘れましたが、Oracle Instant Clientの32bit版が必要です。ここにあります:http://www.oracle.com/technetwork/topics/winsoft-085727.html、64bitはMetaTraderプラットフォームでは動作しません。DBは64ビット版でも構いません。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

コンパイル(Build 610)しようとすると、「array are passed by reference only」のようなエラーメッセージが表示されます。なぜでしょうか?また、どうすればいいのでしょうか?なぜstringではなく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 *;そしてそれはdepricatedです、あなたはstrncpy_sを使用する必要があります。

- sqlcaは宣言されていません。

- ...


誰もが私を助けてくださいすることができますか?


事前にTHX。

マイケル