2.Win32API によるファイル アクセス 本稿では 読み書きするデータは テキスト ( 文字列 ) との前提で解説します ( 絶対パス指定による任意の場所のファイル アクセスを目指します ) (1) 疑問? user 32.dll はどこにある? と思った方 アメンボ以外にいませんか?? そう

Similar documents
Win32API;EA にブレーク ポイントを設定する amenbo the 3rd アメンボです EA のデバッグ時に ブレーク ポイント を設定できたら良いと思ったことはありませんか? MT5 には存在する (?) 様ですが MT4 では専用機能が見つかりません

(C) 2011 amenbo the 3rd New MQL4(Build 600 以降 ); 基礎 ( その 1) インディケータを表示する アメンボです New_MQL4 では MQL5 類似の OOP(Object-oriented programming) が採用され

(C) 2011 amenbo the 3rd New MQL4(Build 600 以降 ); 基礎 ( その 2)OnTimer() を使う アメンボです New_MQL4 の特徴とはなんでしょう? 極論を言うと MQL5 から受け継いだ OOP つまり On***() 関

目次 : 1. 本稿の概要 P02 (1) 本稿で実現する システム図 (2) 本稿の記載範囲 (3) 添付プログラムの組合せと基本構成 2. 添付プログラムによる動作例 P05 (1) セット1の使い方 (2) セット2の使い方 3. 添付プログラムのコード詳細 P19 (1) セット1 (2)

[ ニュース ] タブ内容をチャート上に表示する amenbo the 3rd アメンボです 本稿では 前稿 ( ) で投稿した ListView_f.dll の応用を報告します [ ニュース ] タブの内容を読取って チャート上に表示させることを考

[ 操作履歴 ] タブ内容をリアルタイムでモニターする amenbo the 3rd アメンボです 本稿では MT4 システム操作履歴ログ を監視する一手法を紹介します ( [ 操作履歴 ] タブの内容をリアルタイムで読取ることで監視します ) 既に気が付いている諸兄

情報処理演習 B8クラス

Microsoft Word - no15.docx

Taro-ファイル処理(公開版).jtd

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

ファイル入出力

(C) 2011 amenbo the 3rd 擬似トレード提案 ( その 1) MT4/5 のストレテジー テスターのバックテスト機能は非常に強力ですが 幾つか不満があ ります その一つは 今表示されているリアルチャート上で EA を試したらどうなるかが良 く判らないことです アメンボが以前気に入

スライド 1

Microsoft Word - Writing Windows Installer's DLL.doc

CashDrawer ライブラリ API 仕様書 2014/07/09 CashDrawer ライブラリ API 仕様書 Rev / 10

PowerPoint プレゼンテーション

本書は INpMac v2.20(intime 5.2 INplc 3 Windows7/8/8.1に対応 ) の内容を元に記載しています Microsoft Windows Visual Studio は 米国 Microsoft Corporation の米国及びその他の国における登録商標です

モバイルアプリを Azure で作る - データを扱う Azure Storage を利 してデータを保存する 本稿では PHP と Windows Azure を使って 画像などのファイルを扱うアプリケーションを開発する方法を説明します Windows Azure Platform では データの

ファイル操作-バイナリファイル

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

1. イベント ハンドリング関数とトリガ 一覧 (MQL5 との比較 ) On****() 形式のハンドリング関数のこと (C) 2011 amenbo the 3rd New_MQL4 で使用可能な ハンドリング関数 を MQL5 と比較しながら 使用方法を解説します 機能サホ ート New MQ

WinAPIOverride32 入門

IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators

MSI Tip: システム検索による INSTALLDIRの設定

02: 変数と標準入出力

API 連携方式 外部 DLL の呼び出し宣言 外部 DLL の呼び出し宣言のサンプルコード (Microsoft Visual C#.NET の場合 ) プログラムコードの先頭で using System.Runtime.InteropServices; が必要 クラスの内部に以下のような外部 D

プロセス間通信

Android Layout SDK プログラミング マニュアル

SolarWinds Event Log Forwarder for Windows v

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

Windows10の標準機能だけでデータを完全バックアップする方法 | 【ぱそちき】パソコン初心者に教えたい仕事に役立つPC知識

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

A. InstallScript プロジェクト InstallScript インストールは InstallScript エンジンによって制御され 決められた順序で一連のイベントが生成されます これらのイベントは インストールを実行するソフトウェアハンドラーをトリガーします たとえば インストールがロ

DWR-S01D Updater 取扱説明書 発行日 :2011/2/28

C#の基本

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

GS1-128 の描画 DLL について (ver. 2.3) 動作環境など動作環境 WindowsXP Windows Vista Windows7 Windows8/8.1 Windows10 上記 OS について すべて日本語版を対象としております 32bit アプリケーションから呼び出される

Microsoft PowerPoint - 5Chap15.ppt

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

無線LAN JRL-710/720シリーズ ファームウェアバージョンアップマニュアル 第2.1版

C言語講座 ~ファイル入出力編~

VB6互換のファイルの処理

Microsoft PowerPoint - prog04.ppt

untitled

Microsoft Word - Cプログラミング演習(10)

C 資料 電脳梁山泊烏賊塾 ファイルの入出力 C++ のバイナリファイル入出力 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで Visual C++ の Windows デスクトップを選択し Windows コンソールアプリケーションを作成する

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

Maple 12 Windows版シングルユーザ/ネットワークライセンス

ファイル操作

Javaプログラムの実行手順

24th Embarcadero Developer Camp

スクールCOBOL2002

UIOUSBCOM.DLLコマンドリファレンス

Java講座

Microsoft Word - DWR-S01D_Updater_取扱説明書_120514A.doc

Microsoft PowerPoint - 14th.ppt [互換モード]

PowerPoint Presentation

intra-mart Accel Platform — 招待機能プログラミングガイド   初版  

目次 1 I2Cとは 13 結線写真 2 センサの多くがI2Cに対応 14 WHO_AM_I 3 マイコンでのI2C通信例 15 I2C読込みプログラム 4 とは 16 I2C読込みスクリプト概要① 5 タイミングパラメータ 17 I2C読込みスクリプト概要② 6 書込み 18 センサ読込みプログラ

DWT-B01 Updater 取扱説明書 発行日 :2011/3/23

Transcription:

Win32API; 任意フォルダ内のファイル アクセス アメンボです 実は ある大問題解決のために 任意フォルダー 中のファイルをアクセス 解析するための DLL を時間をかけて何とか完成したのですが その作成中に調べた資料で Win32API(kernel32) を使えば MQL4 からでも 絶対パス が使えることに気が付いてチョット試したところ簡単に出来てしまい 気が抜けてしまいました ( せっかく苦労して作った DLL が~ ) 大問題解決のためには 更に 大きすぎる壁 が立ちはだかっているのが判ったので この解決は後回しとして 本稿では Win32API(kernel32) を使った 任意フォルダー中 のファイル アクセス方法を解説することにしました ( アメンボは 今回初めて Win32API に触った超初心者ですので 内容不備はご容赦 ) なお 本コードの動作は Windows XP と MT4 の組合せで試したのもです ( 恥ずかしながら アメンボのメイン PCは未だに XP なのです もっとも MT4 との相性は最適 ) 本稿 MQL4 コード はダウンロード用に同時掲載してあります ----------------------------------------------------------------------------------- 目次 : 1.MQL4 のファイル アクセス可能範囲 1 頁 2.Win32API によるファイル アクセス (1) 疑問 2 頁 (2) 準備 3 頁 (3) 実施例 4 頁 3.MQL4 コード一覧 5 頁 ----------------------------------------------------------------------------------- 1.MQL4 のファイル アクセス可能範囲 投稿済みの MQL4; 基礎の確認 ( その3) でも解説したように アクセス可能なフォルダーは限定されています ( 使いやすい と言えば言えなくも無いですが ) 資料を読んでいたら MT4システム保護? のためとか書いてありましたが ホントかどうか は不明です ファイル オープン関数 と アクセス可能フォルダー の関係( 再確認 ); ファイル オープン関数 FileOpen() FileOpenHistory() アクセス可能な \MetaTrader 4 at フ ローカー名 以下のフォルダー パス名 \experts\files \tester\files \history\ フ ローカー server_name 1/10

2.Win32API によるファイル アクセス 本稿では 読み書きするデータは テキスト ( 文字列 ) との前提で解説します ( 絶対パス指定による任意の場所のファイル アクセスを目指します ) (1) 疑問? user 32.dll はどこにある? と思った方 アメンボ以外にいませんか?? そう MT4 に初めから附属している Period_Converter.mq4 のコードに出てくる DLL です アメンボは散々 探してしまいましたが とうとう判りませんでした でも Period_Converter.mq4 をコンパイルしてみると 何の問題も無くコンパイル出来てしまうのです Period_Converter.mq4 の中身 抜粋; #property copyright "Copyright ゥ 2007, MetaQuotes Software Corp." #property link "http:www.metaquotes.net" #property show_inputs #include <WinUser32.mqh> WinUser32.mqh の中身 抜粋; #define copyright "Copyright ゥ 2004, MetaQuotes Software Corp." #define link "http:www.metaquotes.net/" #import "user32.dll" ---- messages int SendMessageA(int hwnd,int Msg,int wparam,int lparam); int SendNotifyMessageA(int hwnd,int Msg,int wparam,int lparam); int PostMessageA(int hwnd,int Msg,int wparam,int lparam); void keybd_event(int bvk,int bscan,int dwflags,int dwextrainfo); void mouse_event(int dwflags,int dx,int dy,int dwdata,int dwextrainfo); こんな話をするのは Win32API の各種 DLL の内の kernel32.dll がファイル アクセス機能を提供することを知ったためです アメンボは当所 この kernel32.dll を散々探したのに見つからず どうしようか迷っていたところ kernel32.dll や user 32.dll は個別の DLL として存在するわけでは無い! との記事を読みました そこで Period_Converter.mq4 の user 32.dll のように kernel32.dll もただ宣言するだけで コンパイルしてみたところ なんと OK でした (Win32API 超初心者のアメンボは遠周りが多い!!) kernel32.dll 等は PC が 16 ビットだった時代の古い遺産?? らしいのですが 使えるものは ありがたく使わして頂くこととしました 2/10

(2) 準備 まず MQL4 コード先頭の部分で 最低限使用する 関数類 をインポート宣言します #import "kernel32.dll" int _lopen (string path, int of); int _lcreat (string path, int attrib); int _llseek (int handle, int offset, int origin); int _lread (int handle, string buffer, int bytes); int _lwrite (int handle, string buffer, int bytes); int _lclose (int handle); #import 引数と戻り値を解説 ; ( 必要最小限の記述のみ ; ここには不記載のモード有り ) 戻り値 ( 全て int) 関数引数 成功 ; ファイルハント ル 0 成功 ; ファイルハント ル 0 成功 ; カーソルシスト数 0 成功 ; 読取りハ イト数ファイル最後尾なら 0 成功 ; 書込みハ イト数 成功 ; 0 絶対パス 指定時の注意 ; _lopen (string path, int of) ファイル オープン _lcreat (string path, int attrib) ファイル新規作成 _llseek (int handle, int offset, int origin) カーソル基点 ( 初期 ) と位置 ( シフト数 ) 指定 _lread (int handle, string buffer, int bytes) ファイル内容を読み取る _lwrite (int handle, string buffer, int bytes) ファイルへ書き込む _lclose (int handle) ファイルを閉じる 第 1; ファイルへの絶対パス 第 2; オーフ ン モード 0-read only 1-write only 2-read/write 第 1; ファイルへの絶対パス 第 2; 作成モード 0-read/write 1-read only 第 1; ファイル ハンドル 第 2; ハ イト単位で設定 カーソル基点からのシフト数 第 3; カーソル基点 0- ファイルの先頭 1- 現在位置 2- ファイルの最後尾 第 1; ファイル ハンドル 第 2; 読取り内容の格納先 第 3; 読取るハ イト数 第 1; ファイル ハンドル 第 2; 書込む内容の格納先 第 3; 書込むハ イト数 ファイル ハンドル C:\\myLog\\API.txt の様に記載します フォントを Century 等にした時の見え方 ( C:\\myLog\\API.txt と見える場合もあり フォントを MS 明朝 等にしたとき ) \ ( \ ) を一つ余計に書くのは 初めの \ ( \ ) はエスケープ シーケンスで 2 番目の \ ( \ ) が渡される文字となるためです フォルダの作成については 本稿では記載しません 3/10

(3) 実施例 MQL4 コード詳細は 3.MQL4 コード を参照ください 実際に試してみる場合は C:\myLog フォルダを事前に作っておいてください -1. ファイルへの書き込み ; Win32API_write.mq4 仕様 : string path 先にファイルの有無を確認し 1 無かった場合は新規に ファイル を作成して 2 存在する場合は その ファイル 内に string buffer の文字列データを書き込む -2. ファイル内容の読み込み ( その1); Win32API_read.mq4 仕様 : string path 先のファイルから文字列データを読み取り その内容を string buffer( 文字列バッファ ; 固定長 ) に書き込む -3. ファイル内容の読み込み ( その2); Win32API_read_02.mq4 仕様 : string path 先のファイルから文字列データを読み取り その内容を string buffer+add( 文字列バッファ ; 可変長 ) に書き込む 実施 :13 回 Win32API_write スクリプトを実行した後 21 回 Win32API_read を実施 更に 31 回 Win32API_read_02. を実施して 終了する 結果 ( その1): C:\myLog\API.txt の内容 結果 ( その 2): C:\Program Files\MetaTrader 4 at フ ローカ名.com\experts\logs\ 20120714.log の内容 4/10

3.MQL4 コード一覧 以下のファイル アクセスは テキスト データを対象にしています 以下のコードは 全て スクリプト です (1) ファイル書き込み例 ファイルが存在しない場合は指定フォルダー中に ファイル を新規作成し データを書き込みます ファイルが存在する場合は その中にデータを追記します ( 注 ); 新規にフォルダーを作る機能はありません +------------------------------------------------------------------+ Win32API_write.mq4 amenbo +------------------------------------------------------------------+ #property copyright "amenbo" #import "kernel32.dll" int _lopen (string path, int of); int _lcreat (string path, int attrib); int _llseek (int handle, int offset, int origin); int _lread (int handle, string buffer, int bytes); int _lwrite (int handle, string buffer, int bytes); int _lclose (int handle); #import +------------------------------------------------------------------+ script program start function +------------------------------------------------------------------+ int start() ---- string path="c:\\mylog\\api.txt"; string buffer="abcdefghijklmnopqrstuvwxyz1234567890"; string cr="\r\n"; 改行 & リターン int count=stringlen (buffer); int result_o; int result_o2; int result_o3; int result_o4; int handle_o=_lopen (path,1);write_mode if(handle_o<0) int handle_c=_lcreat (path,0);create file(mode;reading or writing) int result_c=_lclose (handle_c);close file handle_o= -1; if (handle_o<0) 5/10

int handle_o2=_lopen (path,1);try open_file again(write_mode) if(handle_o2<0) Print("Error opening file ",path); if(handle_o>0) result_o2=_llseek (handle_o,0,2); result_o3=_lwrite (handle_o,cr,2);2バイト書き込み result_o3=_lwrite (handle_o,buffer,count); result_o4=_lclose (handle_o); else result_o2=_llseek (handle_o2,0,0); result_o3=_lwrite (handle_o2,buffer,count); result_o4=_lclose (handle_o2); -------- if(result_o2<0) Print("Error placing cursor"); if(result_o3<0) Print("Error writing to file ",path," ",count," bytes"); result_o4=_lclose (handle_o2); if(result_o4<0) Print("Error closing file ",path); ---- PlaySound("alert2.wav"); ------- 2012.07.14 (C) 2011 amenbo the 3rd 6/10

(2) 指定ファイル内から string buffer( 固定長 ) 内にデータを読み込みます +------------------------------------------------------------------+ Win32API_read.mq4 amenbo type1 +------------------------------------------------------------------+ #property copyright "amenbo" #import "kernel32.dll" int _lopen (string path, int of); int _lcreat (string path, int attrib); int _llseek (int handle, int offset, int origin); int _lread (int handle, string buffer, int bytes); int _lwrite (int handle, string buffer, int bytes); int _lclose (int handle); #import +------------------------------------------------------------------+ script program start function +------------------------------------------------------------------+ int start() ---- string path="c:\\mylog\\api.txt"; string buffer=" "; Print("Before: buffer= ",buffer); int count=30; int result_o; int handle_o=_lopen (path,0);read_mode if(handle_o<0) Print("Error openig file",path); result_o=_llseek (handle_o,0,0);set cursor top of file if (result_o<0) Print("Error placing cursor",path); --------- int result_o2=_llseek(handle_o,0,0); -------- if(result_o2<0) Print("Error placing cursor"); -------- 7/10

int result_o3=_lread(handle_o,buffer,count); -------- if(result_o3<0) Print("Error reading from file ",path," ",count," bytes"); int result_o4=_lclose(handle_o); if(result_o4<0) Print("Error closing file ",path); ---- Print("After: buffer= ",buffer); PlaySound("alert2.wav"); ------- 2012.07.14 (C) 2011 amenbo the 3rd 8/10

(3) 指定ファイル内から string buffer( 可変長 ) 内にデータを読み込みます +------------------------------------------------------------------+ Win32API_read_02.mq4 amenbo type2 +------------------------------------------------------------------+ #property copyright "amenbo" #import "kernel32.dll" int _lopen (string path, int of); int _lcreat (string path, int attrib); int _llseek (int handle, int offset, int origin); int _lread (int handle, string buffer, int bytes); int _lwrite (int handle, string buffer, int bytes); int _lclose (int handle); #import +------------------------------------------------------------------+ script program start function +------------------------------------------------------------------+ int start() ---- string path="c:\\mylog\\api.txt"; string buffer="";type2 string add="k";type2 Print("Before: buffer= ",buffer); int count=30; int count=0;type2 int result_o; int handle_o=_lopen (path,0);read_mode if(handle_o<0) Print("Error openig file",path); result_o=_llseek (handle_o,0,0);set cursor top of file if (result_o<0) Print("Error placing cursor",path); --------- int result_o2=_llseek(handle_o,0,0); -------- if(result_o2<0) Print("Error placing cursor"); 9/10

-------- int result_o3=_lread(handle_o,buffer,count); int result_o3=_lread(handle_o,add,1); while(result_o3>0) buffer=buffer+add; add="a"; result_o3=_lread(handle_o,add,1); -------- /* if(result_o3<0) Print("Error reading from file ",path," ",count," bytes"); */ int result_o4=_lclose(handle_o); if(result_o4<0) Print("Error closing file ",path); ---- Print("After: buffer= ",buffer); PlaySound("alert2.wav"); ------- 2012.07.14 (C) 2011 amenbo the 3rd 以 上 10/10