• ベストアンサー

VBでオープンしたファイルの制御をCのプログラムに渡す方法

VBでファイルのオープンをしてそのファイルの制御を Cのプログラムに渡す方法ってありますか? やりたいことを具体的にいうと ファイルのオープン、クローズはVBでやって、 ループの中の変数の値を、Cのプログラムに渡して Cのプログラムの中で印字するって処理をやりたいのです。 Cのプログラムをコールする際の引数で VBで開いたファイルハンドル、出力したい変数の値を 渡してやれば良いのかなと思ったのですが、うまくいかないようです。 なにか方法があれば教えてください。 宜しくお願い致します。 Dim i as Integer Open "\test.txt" For Output As #1 for i=0 to 10 call Cのプログラム(#1、i) next i close #1

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

>Createfileの戻り値はLong型ですよね? 正確にはHANDLE型です。 >今回呼び出したいC言語のDLLではfprintf関数を使っており、 >fprintfの関数ではファイル構造体のポインタを渡す必要があるみたいです。 そうです。 >>VBからは、標準C関数は呼べないので、CreateFile()というAPIを使用するしかないでしょう。 fprintfは、標準C関数でオープンしたファイルポインタを使用するので、CreateFileで開いたハンドルは使用できません。 >VBで取得したCreatefileのLong型の戻り値と >C言語のファイル構造体へのポインタというのは >同じ値を持っているわけではないのでしょうか? はい。違います。 よって、fprintfやfscanf、freadなどは使用できません。 読み書きにもWinAPIを使用する必要があります。 fprintfで直接ファイルに書式指定して書き込むのではなく、 sprintfで文字列を作成後、WriteFileというAPIで書き込む等の工夫が必要となります。 もしくは、DLLの方にファイルをオープンする関数、クローズする関数を追加し、VBからはそれらを呼び出す処理を追加するという方法もあります。 このときは、オープンする関数はファイルポインタを返してあげ、書き込む関数を呼び出すときには、受け取ったファイルポインタを引数に指定してあげればよいかと。

ino1227
質問者

お礼

ありがとうございました。 なんとか望む形にできました。

その他の回答 (4)

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.4

call Cのプログラム("\test.txt"); for(i=0; i<=10; i++){  Cのshori処理(i)  } DLLで関数を作り それを、ファイル名を引数にして 呼び出す。 これが簡単でしょう。

  • kaha
  • ベストアンサー率23% (41/177)
回答No.3

自身はありませんが、アドバイス。 ●fp を *fp にしてみるとか。 fprintf(*fp,"%-8.8s%-3.3s\n",a,b); ●トレースで実行結果の確認をするとか。 (トレースがイミディエイトウインドウに表示される?) TRACE( "fp=%lx a=%s b=%s", *fp,a,b ); ●呼び出した先で値を変更するならVisual Nasic側の引数の宣言にByRefをつけるとか。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

Openでは無理です。 VBのファイル番号はVBの中だけでした通用しません。 CのDLLにオープンしたファイルの情報を渡したいのであれば、 Cのプログラムで使用できる形式でオープンする必要があります。 VBからは、標準C関数は呼べないので、CreateFile()というAPIを使用するしかないでしょう。

ino1227
質問者

お礼

ありがとうございました。 早速やってみます。

ino1227
質問者

補足

教えていただいたとおりCreatefileのAPIを使ってみたのですが、うまくいきません。 Createfileの戻り値はLong型ですよね? 今回呼び出したいC言語のDLLではfprintf関数を使っており、 fprintfの関数ではファイル構造体のポインタを渡す必要があるみたいです。 VBで取得したCreatefileのLong型の戻り値と C言語のファイル構造体へのポインタというのは 同じ値を持っているわけではないのでしょうか? VBのプログラム Dim Filehandle As Long Dim data1 As String Dim data2 As String Dim rtn as Integer Dim udtSecurityAttributes As SECURITY_ATTRIBUTES data1 = "あああ" data2 = "いいい" udtSecurityAttributes.nLength = _ Len(udtSecurityAttributes) Filehandle = CreateFile"c:\test\test.txt", GENERIC_WRITE, 0, udtSecurityAttributes, CREATE_ALWAYS, 0, 0) rtn= Cprintf(Filehandle, data1, data2) CloseHandle Filehandle Cのプログラム int Cprintf( FILE *fp,LPSTR a, LPSTR b ){ fprintf(fp,"%-8.8s%-3.3s\n",a,b); return(0) ; }

  • kaha
  • ベストアンサー率23% (41/177)
回答No.1

関数の宣言はしていますか? 例) Declare Function Cの関数 Lib "ファイル名.dll" (num As Long, i As Long) As Long Dim i, num as Long call Cの関数(num、i)

関連するQ&A