• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:BASIC言語でmciSendCommand関数を扱う時)

BASIC言語でmciSendCommand関数を使ったBGMのリピート再生について

このQ&Aのポイント
  • Active Basicでゲームを作っています。BGMを流すためにPlaySound関数を使用する予定でしたが、wav形式のみに対応していることがわかり、mciSendCommand関数を学習しました。
  • mciSendCommand関数を使用してBGM(今回はmid形式)を再生しようとしましたが、リピート再生がうまくいきませんでした。いくつかの方法を試しましたが、期待通りの動作をせず困っています。
  • MainWndとMenuの2つのウインドウがあり、グローバル変数にはbErrとmopのMCI_OPEN_PARMSが定義されています。再生処理時にSetTimer関数を使用して曲の長さ分のタイマーをセットし、タイムアウト時に再度再生させる方法を試しましたが、うまくいきません。初めての取り組みなので、詳しい方のアドバイスをお待ちしています。

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

  • ベストアンサー
回答No.1

再生開始を指示する際に通知フラグ(MCI_NOTIFY)と、 通知先のウィンドウ(ウィンドウハンドル(HWND))を指定して おきます。 そして通知先に指定したウィンドウに対して飛んでくる MCIからの再生終了通知のメッセージ(MM_MCINOTIFY)を捕まえ、 その処理の中で再度MCIに再生指示すれば、 見かけリピートになるという仕掛けです。 MCI_NOTIFYをgoogleなりで検索してみれば、あとはウィンドウ メッセージの処理のスキルがあれば、すぐにわかると思います。 ちなみに、コードを見れば、下ごしらえはできているように 見えます(よくは見ていませんが)。 Dim mpp As MCI_PLAY_PARMS mpp.dwCallback=hMainWnd <<このウィンドウに通知が飛んできます bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp) あとはhMainWndのウィンドウで 再生終了のメッセージをトラップしてみるだけかもしれません。 WM_TIMERなタイマなんぞ使ってもろくに精度は出ないでしょうから、 やめたほうが良いです。

if-so-at
質問者

お礼

何とかループできました。 ありがとうございました!!

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

関連するQ&A

  • ActiveBasic 音楽のループ再生

    Active Basic4.23.00でプログラムを書いています。 音楽再生ソフトを作ってみようと思い、作り始めたのですが、なかなかループ再生が出来ません。 チェックボックス1がチェックされていると、ループさせようと思っています。 ↓問題のコード Sub MainWnd_MciNotify(flags As Long, DevID As DWord) If SendMessage(GetDlgItem(hMainWnd,CheckBox1),BM_GETCHECK,0,0)=BST_CHECKED Then Dim bErr As Long Dim mpp As MCI_PLAY_PARMS mpp.dwCallback=hMainWnd mpp.dwFrom=0 bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY or MCI_FROM,mpp) If bErr Then MessageBox(hMainWnd,"デバイス再生エラー","Error",MB_OK or MB_ICONHAND) Exit Sub End If Else mpp.dwCallback=hMainWnd mpp.dwFrom=0 End If End Sub 一見、(少なくとも自分は)成功しているように見えるのですが、 2回ループした後、フリーズしてしまいます。 すみませんが、何故そうなるかが分かる方がいらっしゃいましたら、すみませんが、ご教授ください。 お願いします。

  • Active Basic 他のアプリケーションを終了させる

    Active Basic4.23.00を使用しています。 指定したほかのプロセスを終了させようと思っているのですが、 なかなか上手くいきません。 Dim hWnd As HWND Dim err As Long Dim code As DWord hWnd=FindWindow("notepad",NULL) If hWnd=NULL Then MessageBox(hMainWnd,"FindWindowでエラーが発生!","Error",MB_OK or MB_ICONHAND) Exit Sub End If GetExitCodeProcess(hWnd,code) If code=STILL_ACTIVE Then MessageBox(hMainWnd,"GetExitCodeProcessでSTILL_ACTIVEが返った!","Error",MB_OK or MB_ICONHAND) Exit Sub End If err=TerminateProcess(hWnd,code) If err=0 Then MessageBox(hMainWnd,"TerminateProcessでエラーが発生!","Error",MB_OK or MB_ICONHAND) MessageBox(0,Str$(code),"GetExitCodeProcessで取得したコード",MB_OK or MB_ICONINFORMATION) Exit Sub End If このようなコードを書きました。 すみませんが、間違いの指摘のほうをお願いします。 それと、『FindWindow』関数についてです。 ヘルプに、 >lpClassName >検索するクラス名を指定します。必要のないときは、NULL を指定することができます。 とありますが、クラス名≒プロセス名と考えてもいいのでしょうか。 また、lpClassNameを指定し、lpWindowNameにNULLを指定(今回のコードのような場合)では、ハンドルを取得できないのでしょうか。 すみませんが、ご教授をお願いします。

  • ActiveBasic リソースの追加/読み込み

    ActiveBasic 4.23.00 を使用しています。 今回、ファイルの暗号化ソフトを作成しようと思い、手段を考えていたところ、ON ERROR RESUME NEXT様のリソースの追加/読み込みの項目を見つけ、 これでやってみようと作成を始めました。 Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (pFileName As BytePtr,bDeleteExistingResources As Long) As Long Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (hUpdate As Long,lpType As BytePtr,lpName As BytePtr,wLanguage As Long,lpData As VoidPtr,cbData As Long) As Long Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (hUpdate As Long,fDiscard As Long) As Long '定数 Const RT_MANIFESTID=1 Const RT_MANIFEST="BINTYPE" Sub MainWnd_CommandButton1_Click() Dim IsUpdate As Long Dim Update As Long Dim temp As String 'EditBoxをチェック Dim Ed1 As Long Dim Ed2 As Long Dim buf1 As BytePtr Dim buf2 As BytePtr Ed1=GetWindowTextLength(GetDlgItem(hMainWnd,EditBox1)) Ed2=GetWindowTextLength(GetDlgItem(hMainWnd,EditBox2)) If Ed1=0 Then MessageBox(hMainWnd,"埋め込み用物質が選択されていません","Error 1",MB_OK or MB_ICONHAND) Exit Sub End If If Ed2=0 Then MessageBox(hMainWnd,"埋め込み先物質が選択されていません","Error 2",MB_OK or MB_ICONHAND) Exit Sub End If buf1=malloc(Ed1+1) buf2=malloc(Ed2+1) GetDlgItemText(hMainWnd,EditBox1,buf1,Ed1) GetDlgItemText(hMainWnd,EditBox2,buf2,Ed2) temp=MakeStr(buf2) IsUpdate=BeginUpdateResource(buf1,TRUE)'FileName はターゲットファイルのフルパス。Ex:"C:\test.exe" にリソースを埋め込む場合、FileName="C:\test.exe" If IsUpdate=0 Then'エラー free(buf1) free(buf2) MessageBox(hMainWnd,"リソースの埋め込み先に異常あり","Error 3",MB_OK or MB_ICONHAND) Exit Sub EndIf Update=UpdateResource(IsUpdate,RT_MANIFEST,RT_MANIFESTID,MAKELANGID(LANG_JAPANESE,SUBLANG_SYS_DEFAULT),temp,Len(temp)) If Update=0 Then'エラー EndUpdateResource(IsUpdate,TRUE) free(buf1) free(buf2) MessageBox(hMainWnd,"リソースの埋め込み時に異常事態発生","Error 4",MB_OK or MB_ICONHAND) Exit Sub End If EndUpdateResource(IsUpdate,FALSE) free(buf1) free(buf2) MessageBox(hMainWnd,"たぶんエラーなく書き込みを完了しました。","Success!!",MB_OK or MB_ICONINFORMATION) End Sub このように書いてみたのですが、IsUpdate=0でいつもエラーが返ってきます。 何故かが分かりません。 すみませんが、ご存知の方がいらっしゃいましたら、ご教授の方をお願いします。

  • 複数ファイルを1つにまとめる コード添削願い

    複数のファイルを1つのファイルにまとめようとがんばっています。 リストボックスを用意し、ファイル一覧をつくり、 そこからアドレスを取得して、まとめていくという手順です。 ただ、最後のWriteFile関数の部分で、書き込みが出来ずエラーが返ります。 なぜかが分かりません。 ご教授お願いします。 Dim num As Long Dim buf As BytePtr Dim hFile As HANDLE Dim n As Long Dim LastFileSize As Long num=SendDlgItemMessage(hMainWnd,ListBox1,LB_GETCOUNT,0,0) For n=0 to num-1 Step 1 'ファイル名を取得 Dim name As BytePtr Dim len As Long Dim s As String Dim path As String Dim FileSize As Long Dim dwAccessByte As DWord len=SendDlgItemMessage(hMainWnd,ListBox1,LB_GETTEXTLEN,n,0)+1 name=malloc(len) SendDlgItemMessage(hMainWnd,ListBox1,LB_GETTEXT,n,name) s=MakeStr(name) free(name) 'ファイルパスを連結し、読み込む path=str+"\"+s 'ファイルハンドルの作成 hFile=CreateFile(path,GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) If hFile=INVALID_HANDLE_VALUE Then MessageBox(hMainWnd,Ex"ファイルハンドル作成時にエラーが発生しました!","Error File Number Is "+Str$(n)+" .",MB_OK or MB_ICONWARNING) Exit Sub End If 'ファイルのサイズの取得 FileSize=GetFileSize(hFile,0) LastFileSize=LastFileSize+FileSize '領域確保 If n=0 Then buf=malloc(FileSize+1) Else buf=realloc(buf,FileSize+1) End If 'ファイルの読み込み If ReadFile(hFile,buf,FileSize,VarPtr(dwAccessByte),ByVal 0)=0 Then MessageBox(hMainWnd,"ファイル読み込み時にエラーが発生しました!!","Error "+Str$(n),MB_OK or MB_ICONWARNING) MessageBox(hMainWnd,Ex"FileSize="+Str$(FileSize)+Ex"\r\ndwAccessByte="+Str$(dwAccessByte),"",MB_OK or MB_ICONWARNING) End If 'ファイル名とサイズを記録 Open dir+"\FileInfo.txt" For Append As #1 Print #1,s+"="+Str$(FileSize) Close #1 CloseHandle(hFile) Next hFile=CreateFile(dir+"\game.test",GENERIC_WRITE,0,ByVal 0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0) If hFile=INVALID_HANDLE_VALUE Then MessageBox(hMainWnd,Ex"ファイルハンドル作成時にエラーが発生しました!","Error File Number Is At Last",MB_OK or MB_ICONWARNING) Exit Sub End If If WriteFile(hFile,buf,LastFileSize,VarPtr(dwAccessByte),ByVal 0)=FALSE Then MessageBox(hMainWnd,"ファイル作成時にエラーが発生しました!!","Last Error",MB_OK or MB_ICONWARNING) MessageBox(hMainWnd,Str$(LastFileSize)+","+Str$(dwAccessByte),0,0) End If CloseHandle(hFile) free(buf) MessageBox(hMainWnd,"処理終了","End",MB_OK or MB_ICONINFORMATION)

  • Active Basicで、バツボタンを押したときの処理

    Active Basicでプログラムを書いていて、『×』ボタンを押すと、終了の確認のメッセージを出して、『はい』なら終了、『いいえ』ならプログラムの継続といったものを作りたいのですが、出来ません。 Sub MainWnd_QueryClose(ByRef cancel As Integer) If MessageBox(hMainWnd,"終了しますか?","確認",MB_YESNO or MB_ICONINFORMATION) = IDNO Then Exit Sub End If End Sub 今回使ったコードです。 すみませんが、何処を修正すれば良いかご存知の方、ご教授ください。

  • Active Basic 再描写処理

    最近デバイスコンテキストを何とか理解してきたので、実験的に『上から物体が振ってくるのを避ける』というゲームを作ってみようと思い作り始めました。 『←』が押されれば、棒人間を左に、『→』が押されれば、棒人間を右に移動させる処理と、ランダムで●が上から落ちてくるという処理をタイマーを使ってやってみました。(スレッドとかはまだ勉強していないので) 一応完成はしたのですが、棒人間を動かすと、どうしても●がちらつきます。 この場合は、どういう風に処理をすればいいのでしょうか? プログラムはこう書きました。 グローバル変数 Dim hBmp01 As HWND Dim hBmp02 As HWND Dim hBmp03 As HWND Dim hBmp04 As HWND Dim hMemDC As HDC Dim BmpInfo As Long Dim hBomDC As HWND Dim Bomxy As RECT Dim x As Long Dim y As Long Dim bx As Long Dim by As Long Dim n As Long '---------------------------------------------------- 省略 '----------------------------------------------------- Sub MainWnd_Destroy() DeleteObject(hBmp01) DeleteObject(hBmp02) DeleteObject(hBmp03) DeleteObject(hBmp04) YokeGame_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) SetWindowText(hMainWnd,"画像描写テスト ~爆弾的なものを避けるゲーム~") hBmp01 = LoadImage(0,".\画像\人\普通.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp02 = LoadImage(0,".\画像\人\右.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp03 = LoadImage(0,".\画像\人\左.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp04 = LoadImage(0,".\画像\爆弾\ボム.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) GetWindowRect(hBmp04,Bomxy) If hBmp01=0 or hBmp02=0 or hBmp03=0 or hBmp04=0 Then MessageBox(hMainWnd,Ex"画像の読み込みに失敗しました\r\n強制終了します。","Error",MB_OK or MB_ICONHAND) DeleteObject(hBmp01) DeleteObject(hBmp02) DeleteObject(hBmp03) DeleteObject(hBmp04) SendMessage(hMainWnd,WM_CLOSE,0,0) End If x=290 y=275 BmpInfo=1 bx = 320 by = 0 SetTimer(hMainWnd,0,300,0) End Sub Sub Kettei() Dim ok As Long by=0 Do Randomize bx = Fix(Rnd()*100) If bx>0 and 630>bx Then ok=TRUE End If Loop Until ok=TRUE End Sub Sub MainWnd_Paint(hDC As HDC) hMemDC = CreateCompatibleDC(hDC) hBomDC = CreateCompatibleDC(hDC) If BmpInfo = 1 Then SelectObject(hMemDC,hBmp01) Else If BmpInfo = 2 Then SelectObject(hMemDC,hBmp02) Else If BmpInfo = 3 Then SelectObject(hMemDC,hBmp03) End If BitBlt(hDC,x,y,40,50,hMemDC,0,0,SRCCOPY) Sleep(30) SelectObject(hMemDC,hBmp01) BitBlt(hDC,x,y,40,50,hMemDC,0,0,SRCCOPY) Sleep(30) SelectObject(hBomDC,hBmp04) BitBlt(hDC,bx,by,9,9,hBomDC,0,0,SRCCOPY) DeleteDC(hMemDC) DeleteDC(hBomDC) BmpInfo = 1 End Sub Sub MainWnd_KeyDown(KeyCode As Long, flags As Long) If KeyCode = 37 Then If x<=0 Then x=0 Exit Sub End If x = x - 10 BmpInfo=3 End If If KeyCode = 39 Then If x>=600 Then x = 600 Exit Sub End If x = x + 10 BmpInfo=2 End If InvalidateRect(hMainWnd,ByVal 0,TRUE) End Sub Sub MainWnd_Timer(TimerID As DWord) If TimerID = 0 Then by = by + 10 InvalidateRect(hMainWnd,Byval 0,TRUE) If by >=360 Then Kettei() End If End If End Sub っと、このようになりました。(一応動きます) strictには、チェックを入れていません。 バージョンは、4.23.00を使っています。 それと、InvalidateRect関数なのですが、 InvalidateRect(hMainWnd,Byval 0,TRUE) の、二つ目のパラメータ(?)部分に、全体を再描写させるときに何故『Byval 0』と表記するのでしょうか? ヘルプには、NULL を指定すると、クライアント領域全体が更新領域に設定されますと書かれていますが、NULLを指定すると無効な識別となります。 すみませんが、分かる方がいらっしゃいましたら、ご教授をお願いします。

  • Cのソースファイルにすると警告が出る理由

    wavファイルを再生するプログラムを勉強中なのですが、下のプログラムをビルドすると error C2055: 型リストではなく、仮パラメーター リストが必要です。 warning C4047: '関数' : 間接参照のレベルが 'MCIDEVICEID' と 'void *' で異なっています。 warning C4024: 'mciSendCommandW' : の型が 1 の仮引数および実引数と異なります。 という警告が出ます。 いろいろ試した結果、ソースファイルの拡張子をcからcppに変更したら警告が消えたのですがどうして拡張子がCのソースファイルでビルドすると警告がでるのか理由が全く分かりません。 拡張子を変更しないで警告を出さないようにするにはどこを直せばいいのでしょうか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語 #include<Windows.h> #include "resource.h" #include<MMSystem.h> #pragma comment(lib,"winmm.lib") HINSTANCE hinst; INT_PTR CALLBACK dlgproc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int nCmdShow) { hinst=hInstance; DialogBox(hinst,TEXT("mydlg"),NULL,dlgproc); return 0; } INT_PTR CALLBACK dlgproc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp) { static MCI_OPEN_PARMS mop; static MCI_PLAY_PARMS play; switch(msg) { case WM_INITDIALOG: mop.lpstrDeviceType=TEXT("WaveAudio"); mop.lpstrElementName=TEXT("C:\\Users\\test.wav"); mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD_PTR)&mop); mciSendCommand(mop.wDeviceID,MCI_PLAY,NULL,(DWORD_PTR)&play); return (INT_PTR)TRUE; case WM_CLOSE: EndDialog(hwnd,LOWORD(wp)); return (INT_PTR)TRUE; break; } return(INT_PTR)FALSE; }

  • midiの再生が思うようにできません

    ファイルの文字列を1行ずつ読み込み、文字列の数字の範囲によって再生する音楽を変えるプログラムを作成していますが、読み込んだ文字列とは無関係に、ループの初めの範囲で指定してある音楽しか再生されません。読み込んだ文字列ごとに再生音楽を変えるにはどうすればいいのでしょうか?分かる方ご教授願います。 環境:WindowsXP, Visual C++ 2008 Express Edition 以下がプログラムのソースの一部です。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { FILE *fp; errno_t err; TCHAR buf[30]; TCHAR *temp; int m=0, n=0; switch(msg) { case WM_CREATE: CreateWindow(TEXT("BUTTON"), TEXT("Play"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,120, 100, 70, 70, hWnd, NULL, hInst, NULL); break; case WM_COMMAND: err = _tfopen_s(&fp, TEXT("C:\\Documents and Settings\\m22015\\My Documents\\Visual Studio 2008\\Projects\\process\\process\\Corner.txt"), TEXT("r+")); if(err != 0) break; temp = (TCHAR*)malloc(_tcsclen(buf)+1); if(temp == NULL){ MessageBox(hWnd, TEXT("Can't secure of memory"), TEXT("Error"), MB_OK); break; } for(int i=0; i<2; i++){ _fgetts(buf, 10, fp); _tcstok(buf, TEXT("\n")); } while(_fgetts(buf, 30, fp) != NULL){ _tcstok(buf, TEXT("\n")); _tcscpy(temp, buf); while(_stprintf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){ if((m>=0 && m<110)&&(n>=0 && n<200)){ if(mciSendString(_T("play C+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play C+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=110 && m<220)&&(n>=0 && n<200)){ if(mciSendString(_T("play D+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play D+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=220 && m<330)&&(n>=0 && n<200)){ if(mciSendString(_T("play E+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play E+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=330 && m<440)&&(n>=0 && n<200)){ if(mciSendString(_T("play F+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play F+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=440 && m<550)&&(n>=0 && n<200)){ if(mciSendString(_T("play G+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play G+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=550 && m<660)&&(n>=0 && n<200)){ if(mciSendString(_T("play A+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play A+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=660 && m<770)&&(n>=0 && n<200)){ if(mciSendString(_T("play B+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play B+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if(mciSendString(_T("play C.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play C.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=110 && m<220)&&(n>=200 && n<400)){ if(mciSendString(_T("play D.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play D.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; 以下省略 . . . }else{ break; } } } free(temp); fclose(fp); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wParam, lParam)); } return 0; }

  • 数列の計算後

    前に質問したのですが、 文字列を数列として扱う関数は分かりました。 その数字を計算し、変数に格納する所までは出来たのですが、 SetDlgItemText関数で、EditBox4にその変数を表示することが出来ません。 変数内には、きちんと数字が入ってます。 MessageBox関数を用いて変数内をテストで表示させようとすると、 アクセスエラーが出ます。 小数点も扱いたいので、Double型を指定しているのですが・・・ どう対処したら良いか分かりません。 すみませんが、ご教授願います・・・ ↓問題のコードです 'EditBoxの内容を取得 Dim Buffer As BytePtr Dim Length As Long Length = GetWindowTextLength(GetDlgItem(hMainWnd,EditBox1)) Buffer = calloc(Length+1) GetWindowText(GetDlgItem(hMainWnd,EditBox1),Buffer,Length+1) SaishoKazu=Val(Buffer) Length = GetWindowTextLength(GetDlgItem(hMainWnd,EditBox3)) Buffer = calloc(Length+1) GetWindowText(GetDlgItem(hMainWnd,EditBox3),Buffer,Length+1) AtoKazu=Val(Buffer) free(Buffer) '計算処理 If Kigo="+" Then Ans=SaishoKazu+AtoKazu End If SetDlgItemText(hMainWnd,EditBox4,Ans)

  • ActiveBasic リソースの追加と読み込み

    ActiveBasic 4.23.00を使用しています。 以前、リソースの追加方法を教授していただきました。 リソースの追加と言うものは出来るようになったのですが、 文字列の都合上、以前の質問を使用させていただきます。 http://oshiete1.goo.ne.jp/qa4983148.html 上のコードを使用しているのですが、これだとやはり、『文字列』しか追加できないのでしょうか。 zip等のファイルを追加していきたいと思っているのですが、どのようにすればよろしいのでしょうか。 また、このコードを使用して、リソースをプログラムBに追加したところ、 プログラムBのアイコンが消えてしまいました。 これは、何か回避する方法があるのでしょうか。 最後に、 Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (hInstance As DWord,lpName As BytePtr,lpType As BytePtr) As DWord Declare Function FreeResource Lib "kernel32" (hResData As DWord) As DWord Declare Function SizeofResource Lib "kernel32" (hInstance As DWord,hResInfo As DWord) As DWord Declare Function LoadResource Lib "kernel32" (hInstance As DWord,hResInfo As DWord) As DWord Declare Function LockResource Lib "kernel32" (hResData As DWord) As Long Const RT_MANIFESTID=50'埋め込んだ時と同じIDにしてください Const RT_MANIFEST="BINTYPE" Dim FileName[MAX_PATH] As Byte Dim hDLL As DWord, hResource As DWord, lResource As DWord Dim File As BytePtr GetModuleFileName(NULL,FileName,MAX_PATH) hDLL=LoadLibrary(FileName) If hDLL=0 Then MessageBox(hMainWnd,"ファイルの取得に失敗","Error 1",MB_OK or MB_ICONHAND) Exit Sub End If hResource=FindResource(hDLL,RT_MANIFESTID,RT_MANIFEST) If hResource=0 Then FreeLibrary(hDLL) MessageBox(hMainWnd,"ファイルの取り出しに失敗!","Error 1",MB_OK or MB_ICONHAND) Exit Sub End If lResource=LoadResource(hDLL,hResource) File=LockResource(lResource) FreeResource(lResource) FreeLibrary(hDLL) プログラムBに追加した物を取り出すプログラムですが、これはプログラムBに書きました。 実行すると、読み出しの部分でエラーが生じるのですが、どのように回避していけばよろしいのでしょうか。 長々と多くの質問をしてしまいすみません。 しかし、全然解決できずにもやもやしていて困っています。 何かやり方をご存知の方がいらっしゃいましたらご教授をお願いします。