やっぱりDLLの使い方が分からないorz

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ma

やっぱりDLLの使い方が分からないorz

#1

投稿記事 by Ma » 15年前

いつもおせわになってます><
今回DLLを使って録音機能をDXライブラリ(VC++2008 Express Editon)で作ったソフトに加えようと思っています。

で、

http://www.vector.co.jp/soft/winnt/prog/se341363.html

こちらにある、WAVE録音/再生用のDLLを使おうと思っています。
ところが、C#で作られていて、サンプルを見てもC#での使い方しかありませんでした。
(C++から呼び出せますよね?)


C#は少ししか理解していないので、ソースを見てもどう応用すればいいか検討もつきません。

DLLについての簡単な知識は
http://www.ne.jp/asahi/hishidama/home/t ... p/dll.html
こちらのサイトを読んだくらいです。
あとは、他のDLLを使った回数は1,2回しかありません。
しかも、いままでは関数を利用したことしかなく、dllからのクラスを扱ったことがありません。
そのときは、CかC++でのサンプルだったのでわかりやすかったのですが。。。

今回は、libファイルがないことから明示的・動的リンク であることはわかりましたが、
↑のサイトではdllからの関数を利用する方法しかかかれていないので、クラスの場合がよく分かりません。
(さらにいえば、詳しいリファレンスがない(または私が見つけられない)ので、どこをみれば関数名やクラス名がわかるのか、あいまいです。)



私が参考になるものだと思ったのをSampleRecorder というサンプルプログラムのソースコードから転載させていただきます。




====PCMRecorder[メタデータから]====
using System;
using System.Windows.Forms;

namespace LIB
{
public class PCMRecorder
{
public PCMRecorder(Form form, IPCMRecorder ipr);
public PCMRecorder(Form form, IPCMRecorder2 ipr2);
public PCMRecorder(Form form, IPCMRecorder2 ipr2, int bufSize, int numberOfBuf);

public void Close();
public void Start(int ch, int hz);
public void Stop();
}
}



====WavWriter[メタデータから]====

using MMSYSTEM;
using System;
using System.IO;

namespace RIFF
{
public class WavWriter
{
public WavWriter(Stream stream, WAVEFORMATEX format);
public WavWriter(string path, WAVEFORMATEX format);

public void Close();
public void Rewind();
public void Write(byte[/url] wave, int size);
public void Write(short[/url] wave, int size);
public void WriteEnd();
}
}




このdllを使って、WAVE録音する手順を教えてください。

具体的には、
1.特別にプロジェクトファイルを設定する必要があるか。(プロジェクトのプロパティだとか、ツール→オプション内など。)
2.またあるなら、どの項目をどのように変更すればいいのか。
3.C++のプログラム内での利用方法。
(とくにクラス名だとか関数名は、C#プログラムのどこをみればいいのかよくわからない。↑がそれっぽいと思ったんですが、どう呼び出せば良いのか。。。)
(4. サンプルがあると、さらにうれしいです) 画像

softya

Re:やっぱりDLLの使い方が分からないorz

#2

投稿記事 by softya » 15年前

マネージドとアンマネージのリンクは結構厄介です。
出来上がったプログラムの配布に、.NET FrameWorkの再配布ランタイムを付けるのも面倒ですけどね。

ここら辺が参考になるかと思います。
http://q.hatena.ne.jp/1090560857
ちなみに、私はやったことがありませんので深く追求されると分かりません。

Ma

Re:やっぱりDLLの使い方が分からないorz

#3

投稿記事 by Ma » 15年前

>http://q.hatena.ne.jp/1090560857
正直、私の理解レベルを超えてて、何を言っているのかあまりわからないです・・・。

他の方法を探したほうがいいかなーって思ったんですが、WindowsAPI を使っても難しそうな気配が・・・。

Ma

Re:やっぱりDLLの使い方が分からないorz

#4

投稿記事 by Ma » 15年前

http://www.codeproject.com/KB/audio-vid ... rding.aspx
このライブラリを利用するのが、(難易度的に)難しいようなら、ここのサイトの方法を使ってみようともいます。
(まだ未チェック)

softya

Re:やっぱりDLLの使い方が分からないorz

#5

投稿記事 by softya » 15年前

アンマネージド(C++)とマネージド(C#)の中間インターフェイスにマネージド(C++/CLI)を使う方法もありますが、どちらにしても覚えることが多くて面倒です。

WindowsAPIならこちら。
http://wisdom.sakura.ne.jp/system/winap ... index.html

http://www.codeproject.com/KB/audio-vid ... rding.aspx
このライブラリなら使うのは簡単そうですね。

Ma

Re:やっぱりDLLの使い方が分からないorz

#6

投稿記事 by Ma » 15年前

(解決押し忘れてた。)

あ、windowsAPI 、読んでみたら一番簡単でしたw
数行で実現したのでびっくりです。

一応書いておくと
グローバル変数として以下追加

MCI_OPEN_PARMS mop;
MCI_SAVE_PARMS msp;


初期化
mop.dwCallback = NULL;
mop.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
mop.lpstrElementName = TEXT("");
mciSendCommand(0 , MCI_OPEN , MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID |MCI_OPEN_ELEMENT , (DWORD)&mop);


録音開始
mciSendCommand(mop.wDeviceID , MCI_RECORD , 0 , 0);

録音終了
msp.dwCallback = NULL;
msp.lpfilename = "testYeah.wav";
mciSendCommand(mop.wDeviceID , MCI_STOP , MCI_WAIT , 0);
mciSendCommand(mop.wDeviceID , MCI_SAVE ,MCI_WAIT | MCI_SAVE_FILE , (DWORD)&msp);


以上でできました


ありがとうございます。
例のサイトは、なんだかMFC使っていてエラーがでたのでやめました。
お手伝いありがとうございました。 画像

閉鎖

“C言語何でも質問掲示板” へ戻る