アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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からはそれらを呼び出す処理を追加するという方法もあります。
このときは、オープンする関数はファイルポインタを返してあげ、書き込む関数を呼び出すときには、受け取ったファイルポインタを引数に指定してあげればよいかと。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/06/04 16:00

call


Cのプログラム("\test.txt");

for(i=0; i<=10; i++){
 Cのshori処理(i)
 }

DLLで関数を作り
それを、ファイル名を引数にして
呼び出す。

これが簡単でしょう。
    • good
    • 0

自身はありませんが、アドバイス。



●fp を *fp にしてみるとか。
fprintf(*fp,"%-8.8s%-3.3s\n",a,b);

●トレースで実行結果の確認をするとか。
(トレースがイミディエイトウインドウに表示される?)
TRACE( "fp=%lx a=%s b=%s", *fp,a,b );

●呼び出した先で値を変更するならVisual Nasic側の引数の宣言にByRefをつけるとか。
    • good
    • 0

Openでは無理です。


VBのファイル番号はVBの中だけでした通用しません。

CのDLLにオープンしたファイルの情報を渡したいのであれば、
Cのプログラムで使用できる形式でオープンする必要があります。

VBからは、標準C関数は呼べないので、CreateFile()というAPIを使用するしかないでしょう。

この回答への補足

教えていただいたとおり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);
}

補足日時:2004/06/01 09:50
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/05/31 13:37

関数の宣言はしていますか?



例)
Declare Function Cの関数 Lib "ファイル名.dll" (num As Long, i As Long) As Long

Dim i, num as Long
call Cの関数(num、i)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!