代码实现:文件后缀为 .cpp 如果去掉 语音朗读 .c 也可以
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
#include<Windows.h>
#include<atlstr.h>
#include<sphelper.h>
#include<sapi.h>
#include<comutil.h>
#include<string.h>
#pragma comment(lib,"sapi.lib")
#pragma comment(lib,"comsupp.lib")
#pragma comment(lib,"ole32.lib")
#pragma warning(disable: 4996)//取消错误
void (*ptr)(wchar_t* str) = NULL;//函数指针,相当于接口,参数为宽字符
int speakit(wchar_t* str);//语音函数
#pragma region 不同的业务处理
//输出到屏幕显示
void print(wchar_t* str)
{
wprintf(L"%ls", str);
}
//弹出消息对话框
void show(wchar_t* str)
{
MessageBoxW(NULL, str, str, NULL);
}
//语音读出内容
void speak(wchar_t* str)
{
speakit(str);
}
#pragma endregion
//脱离业务逻辑代码变动,使接口固定
void run(void (*pfun)(wchar_t* str), wchar_t* pstr)
{
ptr = pfun;
ptr(pstr);
}
int main(void)
{
setlocale(LC_ALL, "zh-CN");
wchar_t* str =(wchar_t*) L"工厂方法模式\n";
wchar_t* str2 = (wchar_t*)L"工厂方法模式语音朗诵读出\n";
int n = 0;
while (1)
{
print((wchar_t*)L"请输入处理流程\n");
scanf("%d", &n);
switch (n)
{
case 0:
run(print, (wchar_t*)L"程序结束\n");
return 0;
case 1:
run(print, str);
break;
case 2:
run(show, str);
break;
case 3:
run(speak, str2);
break;
default:
break;
}
}
return 0;
}
int speakit(wchar_t* str)
{
ISpVoice* pVoice = NULL;
::CoInitialize(NULL);//单线程创造
//获取ISpVoice接口
long hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice);
hr = pVoice->Speak(str, 0, NULL);
pVoice->Release();
pVoice = NULL;
//释放创造的线程
::CoUninitialize();
return TRUE;
}
如果编译报下错误:
在项目属性中 SDL checks关掉
运行效果: