• ベストアンサー

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

  • VBのファイル処理について

    Dim a(10) as integer と宣言して、aの配列には0~10の値が入っています。 open "test.dat" for output as #1 でファイルに一行で書き込みたいのですが、 write #1,a(0),a(1),a(2) ・・・ のように一つづつ書くしかないのでしょうか? for i=1 to 10 write #1,a(i) というようなループをかけると、 1 2 3 4 のように縦に表示されてしまいます。 もし有効な解決法をおもちでしたらよろしくお願いいたします。

  • VB6.0のOpenイベントでエラーがでます

    VB6.0で以下のOpenコードの部分でエラーが出ます。 --------------------------------------------- Dim intFileNumber As Integer Dim intFreeFile As Integer intFileNumber = intFreeFile Open strDFpath & strDFname For Input As #intFileNumber Do Until EOF(intFileNumber) Line Input #intFileNumber, strData_in Loop Close #intFileNumber --------------------------------------------- エラー内容「実行時エラー52 ファイル名、または番号が不正です」 エラー時のintFileNumberを見ますと「0」です。 上記コードの「intFileNumber」を「1」に置換して実行するとエラーがでません。 変数の宣言が間違っているのでしょうか? 考えられる原因があれば教えていただけませんでしょうか。

  • C言語からのFortranプログラムの呼び出し

    Fortranで記述した以下のような構成の有限要素法プログラムをC言語から呼び出したいのですが,具体的にどのようなコードを記述すればいいのかがわかりません.お教えいただけないでしょうか. サブルーチンinputおよびoutputでは入力および結果ファイルの入出力を行っています. 当方C言語はほぼ初心者です.Fortranのプログラミング環境としてはVisualStudio2005およびVisualFortran9.1を用いています. C言語のプログラミング環境としてはおなじくVisualStudio2005を使用したいとおもっております. [メインプログラム] open (5,file='input.dat') open (6,file='output.dat') /入出力用のファイルを開く call input(parameter1) /各サブルーチンで有限要素法を実行 call bound(parameter2) call matrix(parameter3) call solve(parameter4) call output(parameter5) close (5) /入出力用のファイルを閉じる close (6) stop end

  • エクセルVBA ファイル名を変えながらtxtファイルに出力する方法

    エクセルVBA初心者です 名前/科目 国語 数学 英語 合計 A 53 45 12 110 B 58 59 74 191 C 80 69 58 207 D 45 97 66 208 E 35 85 53 173 F 89 13 79 181 このシート内容を一行ずつテキストファイルに出力したいと考えております。 ファイル名を 生徒A.txt のように生徒・セルの値にしたい場合はどのようにすればよいでしょうか? 分かる範囲で書いたものを載せました アドバイスよろしくお願いします。 Sub test1() Dim ken As Long Dim i As Integer Dim j As Integer Dim fn As Integer fn = FreeFile() ken = Range("a65536").End(xlUp).Row For i = 2 To ken Open "C:\■■■.txt" For Output As #fn For j = 1 To 5 Write #fn, Cells(i, j); Tab; Next j Print #fn, "" Close #fn Next i End Sub

  • 「パスが見つかりません」というエラー

    data.txtにセルの入力内容を出力したくて下記のようなプログラムを書きました。 ところが Open StrFN For Output As #IntFlNo のところで パスが見つかりません というエラーが出てしまいます。原因はわかりますでしょうか。 Sub test() Dim StrFN As String Dim i As Long Dim IntFlNo As Integer StrFN = "c\data.txt" IntFlNo = FreeFile Open StrFN For Output As #IntFlNo For i = 2 To 400000 Write #IntFlNo, Cells(i, 1) & "$" & Cells(i, 2) Next i Close #IntFlNo End Sub

  • c++ 出力ファイル名

    c++ 初心者 です。fortran 77fortran 90でしたら幾分わかります。 c++ のプログラムで、for 文やwhile文の中に出力させる文章を置いて、出力されるファイル名をforやwhileの変数に関連ずけるには、どういったものを書けばよいでしょうか? たとえば、以下のようなプログラムを書いて実行すると、"test"という文が書かれた"1"というファイル名のファイルが出力されます。 / / / / / / / / / / / / / / / / / / / #include <iostream> #include <fstream> using namespace std; int main() { ofstream of; of.open("1", ios::app); of << "test" << endl; of.close(); return 0; } / / / / / / / / / / / / / / / / / / / 上のプログラムの中の出力ファイル名は"1"ですが、これをfor文等のループの中で"1"~"10"として10個のファイルを出力したいです。 以下のように書くと、"i"というファイルに"test"という文字が10個書き込まれます。 / / / / / / / / / / / / / / / / / / / #include <iostream> #include <fstream> using namespace std; int main() { int i; ofstream of;   for(i=0; i<=10; i++) {     of.open("i", ios::app);     of << "test" << endl;     of.close(); } return 0; } / / / / / / / / / / / / / / / / / / / 上のプログラムの中の"i"のクオーテーションマーク""をとって of.open(i, ios::app); のように書いたらエラーでコンパイルできません。また、 of.open((char*) i, ios::app); のように書くとコンパイルはできますが、ファイルができません。 ファイル名"1"に"test" ファイル名"2"に"test" ファイル名"3"に"test" ・ ・ ・ ファイル名"10に"test" という風に出力できればいいのですが... わかる方すみませんが、ご指導願います

  • VB6のコードをC#にしたい

    C#はこちらでよかったでしょうか。。カテゴリ違いだったらすみません。 現在、VB6にて書かれているコードを、C#にて置き換える事になりました。 しかし私はまともなオブジェクト指向の言語で組むのも初めてなら、C系の言語で組むのも初めてで、そこでどうすればいいのか困っています。 VB6で sub aa(i as integer)      dim obj as object   call bb(obj,i)   call obj.run()    end sub    sub bb(byref pobj as object,i as integer)      select case i    case 1:     pobj = new obj1    case 2:     pobj = new obj2   end select    end sub    といったようなコードがあります。obj1とobj2はVBのクラスなのですが、メソッドはどちらも同じrunというものが用意されているとします。 ようは引数の値によって、メソッドやプロパティの形は同じだけれど、メソッドの中身が違うクラスをもらって、そのもらったクラスのメソッドを実行したいわけです。 しかしC#でまったく等価のソースをかくと、当然ながらobjはただのobject形なので、そんなメソッドはないとおこられてしまいます。VB6の場合、そのあたりが厳密でないので許されていたのですが。。。 こういった場合、どのようにソースをかけばいいのでしょうか? やはりobj1,obj2のクラスの方に工夫しないといけないでしょうか? 実はこのオブジェクトを用意しているのが別チームの為、その場合こうしてくれと提案しなくてはなりません。もしそれがなくても可能であればそれにこした事はないのですが。。。 いちおうもらったクラスのタイプをしらべて、それごとにコードをかくという方法は思いついたのですが、それだとobj1、obj2にあたるクラス数が実は種類がたくさんあり、そこだけならまだしも、他にも同じようなコードをたくさんかかなくてはいけなくなってしまいます。 もう少しスマートにするにはどのようにすればいいでしょうか? こういうクラス構成にすれば、とか教えていただければ助かります。

  • VB2005でのファイル操作について

        Dim filedata As String Dim fileNum As Integer Dim fileName As String Dim i As Integer fileName = "C:\Paradata.txt" fileNum = FreeFile() FileOpen(fileNum, fileName, OpenMode.Output) For i = 0 To 9 filedata = data(i, 0) & "," & data(i, 1)・・・・・ PrintLine(fileNum, filedata) Next FileClose あるボタンを押しますと上記のようにテキストファイルにデータを保存しようとしているのですが、1回目のボタンクリックではエラーが無いのですが2回目以降は"別のプロセスで使用されているため、プロセスはファイル 'C:\Paradata.txt' にアクセスできません。"のエラーが発生してしまいます。いろいろと調べているのですがまだわからないのでどこがおかしいか教えてください。よろしくお願い致します。

  • VBで作成した、プログラムについて

    VBで作成した、プログラムについて VBで作成したプログラムをCで作り直したいです。 ソース(フォーム1ロードから、エンドクラスまで)を下記に記載しておきますので、疑問に答えていただけませんか。 ソース: Dim hensu(3, 4) As Integer Dim goukei, i, j As Integer hensu(0, 0) = 20 hensu(0, 1) = 70 hensu(0, 2) = 60 hensu(0, 3) = 30 hensu(0, 4) = 40 hensu(1, 0) = 30 hensu(1, 1) = 50 hensu(1, 2) = 30 hensu(1, 3) = 90 hensu(1, 4) = 40 hensu(2, 0) = 90 hensu(2, 1) = 20 hensu(2, 2) = 80 hensu(2, 3) = 60 hensu(2, 4) = 20 hensu(3, 0) = 40 hensu(3, 1) = 30 hensu(3, 2) = 30 hensu(3, 3) = 60 hensu(3, 4) = 30 label1.text="" For j = 0 to 4 goukei=0 For i = 1 to 3 goukei = goukei + hensu(i, j) Next label1.text=label1.text & goukei & "," Next End Sub End Class 疑問1 forループの部分は、for(j=0; j<5; j++) { } と、 for(i=1; j<4; j++) { } でいいでしょうか。 疑問2 goukei = goukei + hensu(i,j) はどのように記載すれば、よいでしょうか? 疑問3 label1.text=label1.text & goukei & "," の部分は、どのように記載すればよいでしょうか? 疑問4 hensu(0, 0)=20・・・hensu(3, 4)=30 はどう記載すればよいでしょうか? くだらないかもしれませんが、お早めによろしくお願いします。

  • C言語を使ったファイルオープンのプログラムについての質問させてください

    C言語を使ったファイルオープンのプログラムについての質問させてください。 demo_0001~demo_0095までのファイルオープンを行いたいと考えています。 fopen関数を用いて,出来ればfor文(if文を用いていたのですが教授からfor文を使ってみろと言われたため)を使ったプログラムを教えていただけないでしょうか? 今週の金曜日までに提出なので早めの回答お待ちしております。