• ベストアンサー

Visual Basicのエラーについて

「Visual Basicでエンジョイプログラミング」(CQ出版社) いう本に掲載されている「シリアルポートの機能調査」 というプログラムを書いたのですが実行したら 下に書いてあるプログラムのdummy = GetCommProperties(hComm, prop) の部分の「prop」の文字色が変わって 「コンパイルエラー ByRef 引数の型が一致しません。」 と表示されたのですがどこをどう直せばいいかよくわかりません。 何かわかる方がいましたら教えてください。 よろしくお願いします。 'フォームモジュール Form1 Private Sub Form_Load() Command1.Caption = "制御信号線の調査" End Sub Private Sub Command1_Click() 'シリアルポートをオープンする Const GENERIC_READ = &H80000000 Const GENERIC_WRITE = &H40000000 Const OPEN_EXISTING = 3 dummy = CloseHandle(43) comname = "COM1" hComm = CreateFile(comname, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0) If hComm = -1 Then MsgBox comname & "が使えません", 16 End End If Print "ハンドル番号"; hComm dummy = GetCommProperties(hComm, prop) flg = prop.dwProvCapabilities Const PCF_DTRDSR = &H1& Const PCF_RTSCTS = &H2& If flg And PCF_DTRDSR Then Print "DTR/DSRが使用できます" If flg And PCF_RTSCTS Then Print "RTS/CTSが使用できます" dummy = CloseHandle(hComm) End Sub

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

直さないといけない部分、肝心要の部分が質問文にないので、回答できません。 因みに「コンパイルエラー ByRef 引数の型が一致しません。」のエラーは、例えば Declare Function GetCommProperties Lib "kernel32" Alias "GetCommProperties" (ByVal hFile As Long, lpCommProp As COMMPROP) As Long と定義されているのに Dim prop As COMMTIMEOUTS 'この行が間違い。ここを直す必要あり と、違う構造体を宣言して、その違う構造体を dummy = GetCommProperties(hComm, prop) と言う感じで引数に渡そうとした時に起きます。 で、質問文には Dim prop As COMMPROP のように、prop構造体の実体を宣言している部分が書かれてないので、冒頭の「直さないといけない部分、肝心要の部分が質問文にないので、回答できません。」と言う話になる訳です。 もう、どこをどう直せば良いか、判りますよね?

hiro-333
質問者

お礼

ご回答ありがとうございます。 問題は解決しました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

No.2の追加補足。 なお、 Dim prop As ホゲホゲ の行が無い、つまり、変数propを定義し忘れると(どこにも定義してないと) dummy = GetCommProperties(hComm, prop) ってやった瞬間に「ん?propって知らない変数だな。じゃ、取り敢えず暗黙的宣言変数としてInteger型にしちゃえ」と勝手に定義され、その後で「あら?引数の型が違うじゃんかよ」ってエラーが出ます。 変数propがちゃんと定義されてるかも確かめて下さいね。

hiro-333
質問者

お礼

ご回答ありがとうございます。 問題は解決しました!

全文を見る
すると、全ての回答が全文表示されます。
  • PrintScree
  • ベストアンサー率25% (538/2091)
回答No.1

掲載していただいたソースにはエラーとなっているprop変数が定義されていません。オブジェクト変数のようですので必ずどこかで定義/宣言しているはずです。 もう一度、本のソースを良く調べてください。

hiro-333
質問者

お礼

ご回答ありがとうございます。 問題は解決しました!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • COM1ポート開き,9600,8,なし,1,HWの設定で垂れ流しデータ読むだけのCプログラム作って

    ください。Borland C v5.5 無料版 on windows2000 on thinkpadのDOS窓で動いて欲しいだけ、です。基本が解れば、あとは自分で改造したいですので、どなたか、お優しい方、何卒お願いします! 本もないのに、無謀ですが、たとえば以下のは参考になりますか?以下のはC++ですので、ちょっと私には解りません。C++でなく、Cで、書き下して欲しいです。 #include <windows.h> #include <iostream> #include <stdio.h> using namespace std; int main() { HANDLE hComm; char buff[190]; DWORD size; hComm = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); if( hComm == INVALID_HANDLE_VALUE ) exit( 1 ); ReadFile(hComm, buff, 200, &size, NULL); cout << buff << endl; getchar(); CloseHandle(hComm); return 0; }

  • Visual Basic のプルグラムについて

    Visual BasicでパソコンのRS-232-CのRTS信号をON,OFF と繰り返して、波形をオシロスコープで確認しようと しているのですが、 フォールモジュールに Private Sub Command5_Click() For i = 0 To 50000 dummy = EscapeCommFunction(hComm, CLRRTS) dummy = EscapeCommFunction(hComm, SETRTS) Next i Print "RTS終了" End Sub と記述すると波形は確認できるのですが、 フォームモジュールに Private Sub Command6_Click() dummy = RTS Print "RTS終了" End Sub 標準モジュール(又はフォールモジュール)に Function RTS() As Boolean For i = 0 To 50000 dummy = EscapeCommFunction(hCome, CLRRTS) dummy = EscapeCommFunction(hCome, SETRTS) Next i End Function と記述すると波形が確認できませんでした。 どうすればいいの分かりません。 よろしくお願いします。

  • vb コンボボックスのイベントについて

    こんばんわ。 コンボボックスで、 指定の値をマウス操作でクリックしたときと、 キーボードの上下で、移動後returnを押したときだけ、 MsgBox "処理実行" を実行したいです。 keystateを使ってみたのですが、前の情報が残っているのかうまくいきません。keystateの情報をクリアさせるか、シンプルに上記を動作させる何かよい方法はありますでしょうか。 Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Dim flg1 As Boolean Private Sub form_load() Combo1.AddItem (11) Combo1.AddItem (22) Combo1.AddItem (33) Combo1.AddItem (44) End Sub Private Sub Combo1_Keyup(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then 'return flg1 = True Call Combo1_click End If End Sub Private Sub Combo1_click() If (GetKeyState(&H26) <> 0) Or (GetKeyState(&H28) <> 0) Then ' ↑↓ If flg1 = False Then Exit Sub End If End If MsgBox "処理実行" flg1 = False End Sub

  • セルの入力後の常時自動処理

    どちらかのA1の値を入力しEnterキーを押したあとに下記の処理を自動実行するには どうしたら良いでしょうか? お教え願えませんでしょうか。 Windows7・SP1 Office2010 Option Explicit(標準モジュールに書いてあります。) Private Flg As Boolean Sub 処理() If Flg Then Exit Sub Application.OnTime Now + TimeValue("00:00:05"), "処理" If Flg Then Exit Sub If Worksheets("メイン・1").Range("A1") <> Worksheets("祝祭日").Range("A1") Then MsgBox ("祝祭日の日付を反映させるために年度を同じにしてください。") Else: Exit Sub End If(中断モードで実行することはできません。)ここで止まります。 End Sub Sub ストップ() Flg = True End Sub

  • [Excel2000]auto_closeを止めさせるには

    Excel2000で、 特定のボタンを押した場合以外の閉じる処理を キャンセルさせたいのですがうまくいきません sub ボタン押() flg = true end sub sub auto_close() if flg <> true then msgbox "AAA" exit sub end if end sub これでは、どーやってもそのまま終了してしまいます。 なにか良い方法はないでしょうか・・・ よろしくおねがいします。

  • エクセルのコード表示についてですが。。

    Private Sub Worksheet_Change(ByVal Target As Range) (1)If Target.Column <> 4 Then Exit Sub Target.Offset(0, -3) = Now()   ⇒特定のセルに日時自動表示 (2)If Target.Column <> 4 Then Exit Sub  Target.Offset(0, 1) = "DUMMY"  ⇒特定のセルにDUMMYと自動表示 (3)If Target.Column = 4 Then  Target.Offset(0, -2) = "1"  Else             ⇒特定のセルに1と自動表示   (4)If Target.Column = 35 Then  Target.Offset(0, -2) = "2"  ⇒特定のセルに2と自動表示  End If  End If (5)If Target.Value = "T" Or Target.Value = "t" Then  Target.Value = "田中"    ⇒Tと入力すると田中と変換して表示  ElseIf Target.Value = "H" Or Target.Value = "h" Then  Target.Value = "林"     ⇒hと入力すると林と変換して表示  End If  End Sub 上のようなコードを入力すると(3)と(5)が機能しません。。なぜでしょうか??コードの表示がまずいのでしょうか??

  • さっきのバイナリ→テクスト

    FP1 = FreeFile Open Text1.Text For Binary As #FP1 FP2 = FreeFile Open Text3.Text For Output As #FP2 Do While (Not (EOF(FP1))) For i = 1 To 128 Get #FP1, , Bwk(i) Next i flg = 0 If j(1) <> "" Then Swk = Right("00" & Trim(Hex(Bwk(1))), 2) & Right("00" & Trim(Hex(Bwk(2))), 2) For i = 1 To 5 If j(i) <> "" Then If j(i) = Swk Then flg = 1 Exit For End If End If Next i Else flg = 1 End If If flg = 1 Then Swk = "" For i = 1 To 128 Swk = Swk & Right("00" & Trim(Hex(Bwk(i))), 2) Next i Print #FP2, Swk End If Loop Close MsgBox "完了" End Sub 上のプログラムでどこで変換してるのかがわからないんです。誰か教えてください。

  • メモリに読み込んだ音源のPlaySoundによる再生

    HANDLE fh,fh2; DWORD dummy,dummy2; case WM_CREATE: fh=CreateFile(TEXT("F:\\shot.wav"),GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ fh2=CreateFile(TEXT("F:\\ENDING.WAV"),GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ /* バッファ確保 */ lpSound = GlobalAlloc(GPTR,GetFileSize(fh,NULL)); lpSound2 = GlobalAlloc(GPTR,GetFileSize(fh2,NULL)); ReadFile(fh ,lpSound ,GetFileSize(fh ,NULL),&dummy ,NULL); /* 読み込み */ ReadFile(fh2,lpSound2,GetFileSize(fh2,NULL),&dummy2,NULL); /* 読み込み */ CloseHandle(fh); CloseHandle(fh2); として音源をメモリに読み込み、その後イベント発生時にPlaySound関数で音源をならしているのですが、 PlaySound(lpSound,NULL,SND_ASYNC|SND_MEMORY); 一番最初のイベント発生時に音源読み込みに時間が掛かり即座に鳴りません。次のイベント発生時は同時に鳴るのですが.... 一番最初から同時に鳴らすにはどのようにしたら良いでしょうか? 根本的にPlaySound関数では良くないのでしょうか? 御指導の程よろしくお願いします。

  • エラー処理

    Private Sub Worksheet_Activate() Dim wsData As Worksheet Dim number As Variant Const SH_DATA As String = "データ入力" Set wsData = Worksheets(SH_DATA) On Error Resume Next If wsData.Range("G3") = "" Then number = InputBox("個人番号を入力してください") If number Is Nothing Then Exit Sub Else wsData.Range("G3") = number MsgBox "性別を選択してボタン(1)を押してください" End If End If End Sub このコードの If number Is Nothing Then のところがうまく動きません、、、 カーソルをnumberに持っていくと値はきちんとはいっています! なのに何回やっても Exit Sub に飛んでしまいます(-_-;) どなたかよろしくお願いします(__)

  • エクセルVBAのイベントで質問です。

    ダブルクリックイベントで、G12:G31の範囲の文字列をB10:B27の範囲(最下行)に入れていくものを使っていますが、新たにH12:H31にある文字列もダブルクリックするとC10:C27の範囲(最下行)に入れていけるようにしたいと思います。 どのようにすればいいでしょうか。 ご存知の方いらっしゃればお教えいただけると助かります。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, _ Cancel As Boolean) Dim i As Long Dim flg As Boolean If Intersect(Target, Range("G12:G31")) Is Nothing Then Exit Sub If IsEmpty(Target.Value) Then Exit Sub With Worksheets("シートA") For i = 10 To 27 If .Range("B" & i).Value = "" Then .Range("B" & i).Value = Target.Value flg = True Exit For End If Next i If flg = False Then MsgBox .Name & " がいっぱいです。" End If End With Cancel = True End Sub

このQ&Aのポイント
  • DGP-BSW01のベルトが切れました、交換用のベルトを入手したいのですが、どの様に注文すれば入手できるでしょうか?
  • DGP-BSW01はソースネクスト株式会社の製品であり、ベルトの交換が必要な場合は注文する必要があります。
  • ベルトの注文方法は、ソースネクスト株式会社の公式ウェブサイトから注文フォームに必要事項を入力して申し込むことができます。
回答を見る

専門家に質問してみよう