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
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からはそれらを呼び出す処理を追加するという方法もあります。
このときは、オープンする関数はファイルポインタを返してあげ、書き込む関数を呼び出すときには、受け取ったファイルポインタを引数に指定してあげればよいかと。
No.4
- 回答日時:
call
Cのプログラム("\test.txt");
for(i=0; i<=10; i++){
Cのshori処理(i)
}
DLLで関数を作り
それを、ファイル名を引数にして
呼び出す。
これが簡単でしょう。
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をつけるとか。
No.2
- 回答日時:
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);
}
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# visual studioでフォームデザインを作成する時のVB.netとC#の違い 2 2023/06/22 03:04
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
SGファイルって何ですか?
-
CSVファイルへの保存の際、デー...
-
「VBScript」ADODB.Streamにお...
-
マウスポインタの変更
-
分割コンパイルの#defineについて
-
バッチで118項目のCSVを処理し...
-
[VBScript]ファイルの入出力を...
-
VB6でのファイル作成方法
-
VBに、Cのincludeのようなもの...
-
大きいサイズのテキストファイ...
-
fopenできる上限の変更
-
同じ名前のファイルを作った場...
-
■ 移植性のないポインタ変換に...
-
プログラムで文字をBMPファイル...
-
C言語のfopenについて教えてく...
-
CSVファイル
-
Javascript で INI の読み書き
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
CSVファイルへの保存の際、デー...
-
ファイルを記録してあるセクタ...
-
テキストファイルの最終行を削...
-
SGファイルって何ですか?
-
ドラッグアンドドロップでファ...
-
分割コンパイルの#defineについて
-
VBに、Cのincludeのようなもの...
-
fopenできる上限の変更
-
グローバル変数のよくない使い...
-
ファイルの結合
-
大きいサイズのテキストファイ...
-
iniファイルに追記がしたいです。
-
バッチで118項目のCSVを処理し...
-
ハッシュの計算時間について
-
C言語のfopenについて教えてく...
-
Javascript で INI の読み書き
-
Excelマクロでの再読込み方法
おすすめ情報