PDA

View Full Version : سوال: تشخیص نصب کارت صدا



nassim_20
شنبه 13 آذر 1389, 05:08 صبح
می خواهم بدانم آیا کارت صوت نصب شده است یا خیر؟

Felony
شنبه 13 آذر 1389, 07:49 صبح
به وسیله تابع waveOutGetNumDevs کتابخانه MMSystem میتونید تعداد Device هایی که به عنوان کارت صدا شناسایی شدن رو به دست بیارید ، براتون یه نمونه کد نوشتم :


var
i: Integer;
wavCaps: TWaveOutCapsA;
begin
if waveOutGetNumDevs > 0 then
for i:= 0 to waveOutGetNumDevs -1 do
begin
waveOutGetDevCapsA(i, @wavCaps, SizeOf(TWaveOutCapsA));
ShowMessage(string(wavCaps.szPname));
end
else
ShowMessage('Not Installed');
end;

کتابخانه MMSystem رو به Uses اضافه کنید .

nassim_20
یک شنبه 14 آذر 1389, 17:12 عصر
ممنون از پاسختون
فقط زمانیکه این کد رو امتحان کردم مودم رو هم به عنوان کارت صوت شناخت و جز پیغام آورد

Felony
یک شنبه 14 آذر 1389, 17:32 عصر
برای اینکه مودمتون یه چیپ صدا داره و تو سیستم شناخته شده .

nassim_20
سه شنبه 16 آذر 1389, 13:52 عصر
خب چکار کنم که مودم رو بعنوان کارت صوت تشخیص ندهد و فقط در صورت نصب کارت صوت پیغام مناسب رو بدهد

Felony
سه شنبه 16 آذر 1389, 14:31 عصر
میتونید از WMI استفاده کنید و یه درخواست WQL به کلاس Win32_SoundDevice (http://msdn.microsoft.com/en-us/library/aa394463(v=VS.85).aspx) بفرستید و ازش وضعیت کارت صدا رو درخواست کنید .

nassim_20
چهارشنبه 17 آذر 1389, 22:52 عصر
ببخشید من مبتدی هستم و خیلی وارد نیستم اگه میشه با مثال بیشتر توضیح بدهید

Felony
چهارشنبه 17 آذر 1389, 23:07 عصر
این یک نمونه که وضعیت کارت صدا رو نمایش میده :

function VarArrayToStr(const vArray: Variant): String;
function _VarToStr(const V: Variant): String;
var
Vt: integer;
begin
Vt:= VarType(V);
case Vt of
varSmallint,
varInteger : Result:= IntToStr(integer(V));
varSingle,
varDouble,
varCurrency : Result:= FloatToStr(Double(V));
varDate : Result:= VarToStr(V);
varOleStr : Result:= WideString(V);
varBoolean : Result:= VarToStr(V);
varVariant : Result:= VarToStr(Variant(V));
varByte : Result:= char(byte(V));
varString : Result:= String(V);
varArray : Result:= VarArrayToStr(Variant(V));
end;
end;
var
i : Integer;
begin
Result:= '[';
if (VarType(vArray) and VarArray)=0 then
Result:= _VarToStr(vArray)
else
for i:= VarArrayLowBound(vArray, 1) to VarArrayHighBound(vArray, 1) do
if i= VarArrayLowBound(vArray, 1) then
Result:= Result + _VarToStr(vArray[i])
else
Result:= Result+'|' + _VarToStr(vArray[i]);
Result:= Result+']';
end;

function VarStrNull(const V: OleVariant): String;
begin
Result:='';
if not VarIsNull(V) then
begin
if VarIsArray(V) then
Result:= VarArrayToStr(V)
else
Result:= VarToStr(V);
end;
end;

function GetWMIObject(const objectName: String): IDispatch;
var
chEaten: Integer;
BindCtx: IBindCtx;
Moniker: IMoniker;
begin
OleCheck(CreateBindCtx(0, bindCtx));
OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
end;

function SoundDevice: String;
var
objWMIService : OLEVariant;
colItems : OLEVariant;
colItem : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin;
objWMIService:= GetWMIObject('winmgmts:\\localhost\root\CIMV2');
colItems := objWMIService.ExecQuery('SELECT * FROM Win32_SoundDevice','WQL',0);
oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
while oEnum.Next(1, colItem, iValue) = 0 do
begin
Result:= VarStrNull(colItem.StatusInfo);
end;
end;

نمونه استفاده :

ShowMessage(SoundDevice);

تو همون لینک MSDN که تو پست قبلیم دادم توضیحات تکمیلی در مورد StatusInfo داده شده و معنای هر شماره توضیح داده شده .

@ کتابخانه های ActiveX و ComObj و Variants رو به Uses برنامتون اضافه کنید .
@ برای گرفتن نام کارت صدا به جای StatusInfo که در کد بالا قرمز کردمش عبارت Name رو بنویسید .