注册 登录
编程论坛 Delphi论坛

[求助]为什么无效?

青格儿 发布于 2007-10-21 14:52, 1175 次点击
Windows的API里有个检测声卡的函数WaveOutGetNumDevs
我一运行,它就提示,无效动态链接在'Winmm.dll'上,这是什么意思,怎么解决?
这是声明:
function WaveOutGetNumDevs:longint;stdcall;external 'winmm.dll' name 'WaveOutGetNumDevs';
8 回复
#2
青格儿2007-10-21 15:14
function WaveOutGetNumDevs:longint;stdcall;external 'winmm.dll' name 'waveOutGetNumDevs';

这样写,不那样提示了,可是这个函数好像不起作用,我点检测它没反映我是否装声卡,但是为什么不执行?

procedure TForm1.Button1Click(Sender: TObject);
begin
if WaveOutGetNumDevs=0 then
RadioGroup1.ItemIndex:=1
else
radioGroup1.ItemIndex:=0;
end;

end.

两选项居中然都没选中,为什么不执行?


#3
volte2007-10-22 13:09
不太明白你的意思。
请问你调试程序了吗?
#4
anthony6342007-10-22 13:39

RadioGroup1 用错了

procedure TForm1.Button1Click(Sender: TObject);
begin
RadioGroup1.Items.Add('有');
RadioGroup1.Items.Add('没有');
// 本来应该在RadioGroup1的Insepctor里设置比较直观的,写在这里你比较好看点。
if WaveOutGetNumDevs=0 then
RadioGroup1.ItemIndex:=1
else
radioGroup1.ItemIndex:=0;
end;
另外WaveOutGetNumDevs返回的是Cardinal不是longint。
见SDK :
/* waveform audio function prototypes */
WINMMAPI UINT WINAPI waveOutGetNumDevs(void);
typedef unsigned int UINT;

#5
anthony6342007-10-22 13:45

另外api最好不要直接定义
type
function WaveOutGetNumDevs:Cardinal;stdcall;external 'winmm.dll' name 'waveOutGetNumDevs';

建议声明和定义 分开方便调试
type
function WaveOutGetNumDevs():Cardinal;stdcall;
implementation

function WaveOutGetNumDevs; external 'winmm.dll' name 'waveOutGetNumDevs';

#6
volte2007-10-22 19:03

其实cardinal和longint没关系的,
cardinal是无符号整数,
longint是有符号整数。

#7
anthony6342007-10-22 20:14
赞同,一般api返回的值不会出现溢出的。
#8
青格儿2007-10-24 20:58
嗯,明白了,多谢你们的回答!
#9
青格儿2007-10-24 21:04
嗯,明白了,多谢你们的回答!
1