老师 发表于 2017-6-15 13:46:51

C++调用sapi.h在无VS2015的机器上报0xc000007b

这两天一直被这个问题困扰,还请大神搭救!
简单描述如下:
我想用C++写一个dll通过JNI在java里调用,这个dll主要负责接收来自java的字符串,并调用windows的TTS朗读出来。
功能在我的机器上可以运行,但是到了没有VS的电脑上就报错,一般的错误是缺少某个dll,如果将所有依赖的dll都复制目标机器上,报的就不是缺少dll,而是应用程序无法启动0xc000007b的错误。
由于这里是C++的板块,所以简单起见和更好的说明问题,现在在VS2015里用C++写一个控制台程序对问题做详细说明。

以下是程序代码:



#include <sapi.h>
#include <stdio.h>//C头文件,用来提示错误信息
int main()
{
        ::CoInitialize(NULL);//初始化语音环境
        ISpVoice * pSpVoice = NULL;//初始化语音变量
        if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void **)&pSpVoice)))
                //给语音变量创建环境,相当于创建语音变量,FAILED是个宏定义,就是来判断CoCreateInstance这个函数又没有成功创建语音变量,下面是不成功的提示信息。
        {
                printf("Failed to create instance of ISpVoice!\n");
                return -1;
        }
        pSpVoice->Speak(L"可以合成语音么?", SPF_DEFAULT, NULL);//执行语音变量的Speek函数,这个函数用来读文字。
        pSpVoice->Release(); //释放语音变量
        ::CoUninitialize();//释放语音环境
        return 0;
}



以下是程序依赖的dll



以下是在非VS环境中的运行结果




猜想应该是缺少什么文件导致的,网上说在其他机器上要有sapi组件,但我试过了在目标机器上安装组件也没用
还请了解这方面的大神解惑,感激不尽!!!!!!

ba21 发表于 2017-6-15 13:46:52

本帖最后由 ba21 于 2017-6-15 23:03 编辑

老师 发表于 2017-6-15 22:26
1、有没有一劳永逸的办法,如果让用户自己去找这么多,显然是不可能的,有没有方法将环境一起弄出来。
2 ...

1,安装完常用的vc++运行库后。
2,提示缺少ucrtbase.dll, vcruntime140d.dll 。把这两个文件复得到C:\Windows\SysWOW64 下 程序运行一闪而过。
跟你的tts程序放什么位置没关系。
win7 64。 win10 64 测试通过
如果你需要现成的vc++运行库安装文件我这里有: http://pan.baidu.com/s/1nuHBAxb
    ucrtbase.dll, vcruntime140d.dll 下载地址:http://pan.baidu.com/s/1kVp5A2F

ba21 发表于 2017-6-15 14:37:24

没有VS的机子说明没有运行库,你把.net 和 vc++ 运行库都装上试试

老师 发表于 2017-6-15 19:56:50

ba21 发表于 2017-6-15 14:37
没有VS的机子说明没有运行库,你把.net 和 vc++ 运行库都装上试试

我试过了,依然如此
这么高的悬赏,难道就没人要么,回复这么少,自己顶,有大神请指教啊

ba21 发表于 2017-6-15 20:02:06

老师 发表于 2017-6-15 19:56
我试过了,依然如此
这么高的悬赏,难道就没人要么,回复这么少,自己顶,有大神请指教啊

把程序留下。我来试试

ba21 发表于 2017-6-15 20:07:52

再看看你的编译环境参考 http://blog.csdn.net/edd1e/article/details/44918719

老师 发表于 2017-6-15 20:15:19

ba21 发表于 2017-6-15 20:02
把程序留下。我来试试

这里是程序

老师 发表于 2017-6-15 20:19:21

ba21 发表于 2017-6-15 20:07
再看看你的编译环境参考 http://blog.csdn.net/edd1e/article/details/44918719

我是64编译的,也是在64上测试的,不行

ba21 发表于 2017-6-15 20:42:25

事实证明你就是缺少vc++ 运行库,参考 下图。已安装的vc++ 运行库, 提示缺少ucrtbase.dll, vcruntime140d.dll 。把这两个文件复得到C:\Windows\SysWOW64 下 程序运行一闪而过。 win7 64。 win10 64 测试通过

老师 发表于 2017-6-15 21:14:04

ba21 发表于 2017-6-15 20:42
事实证明你就是缺少vc++ 运行库,参考 下图。已安装的vc++ 运行库, 提示缺少ucrtbase.dll, vcruntime140d ...

是不是都要装上:050810121315都要

ba21 发表于 2017-6-15 21:21:48

老师 发表于 2017-6-15 21:14
是不是都要装上:050810121315都要

是的!对应的版本都要安装上

freeparty 发表于 2017-6-15 22:23:29

关于SAPI的使用可以参见我的语音朗读小程序,

注意:SAPI并不是支持所有平台的,

老师 发表于 2017-6-15 22:26:06

ba21 发表于 2017-6-15 21:21
是的!对应的版本都要安装上

1、有没有一劳永逸的办法,如果让用户自己去找这么多,显然是不可能的,有没有方法将环境一起弄出来。
2、我上面用VS015工具查看了所有的依赖,包也都放在程序目录里了,还是会错(包括你上面提到的VCRUNTIME140.dll),这又怎么解释呢

ba21 发表于 2017-6-15 22:43:22

老师 发表于 2017-6-15 22:26
1、有没有一劳永逸的办法,如果让用户自己去找这么多,显然是不可能的,有没有方法将环境一起弄出来。
2 ...

没有。用VS就必须要安装相应的运行库。
这是常识!不同环境编译出来的程序所要用的的运行库就不一样。 这就是VS
1,常用vc++ 运行库打包安装vc++运行库(2005,2008,2010,2012,2013,2015)_x86_x64(像我们封装系统都会把这里安装上)
2,刚刚ucrtbase.dll, vcruntime140d.dll 不知道是哪个版本的;你可以在你的电脑上复制出来

老师 发表于 2017-6-16 11:12:33

ba21 发表于 2017-6-15 20:42
事实证明你就是缺少vc++ 运行库,参考 下图。已安装的vc++ 运行库, 提示缺少ucrtbase.dll, vcruntime140d ...

以下是我装玩所有的运行库的结果,然后我也将程序依赖到的dll都放到了程序同级目录下,结果还是如此

系统win10官方工具制作的iso

老师 发表于 2017-6-16 11:14:34

freeparty 发表于 2017-6-15 22:23
关于SAPI的使用可以参见我的语音朗读小程序,

注意:SAPI并不是支持所有平台的,

win10肯定支持的把,还有请问你的程序呢????

ba21 发表于 2017-6-16 11:33:40

老师 发表于 2017-6-16 11:14
win10肯定支持的把,还有请问你的程序呢????

兄弟,跟你说得这么详细了还不能结贴?你的50B也太难挣了吧。

ba21 发表于 2017-6-16 11:35:31

老师 发表于 2017-6-16 11:12
以下是我装玩所有的运行库的结果,然后我也将程序依赖到的dll都放到了程序同级目录下,结果还是如此

...

请把你的整个程序传上来。单个tts.exe win7 win10我这测了没问题

老师 发表于 2017-6-16 17:13:02

ba21 发表于 2017-6-16 11:35
请把你的整个程序传上来。单个tts.exe win7 win10我这测了没问题

请问测试系统上装了VS么?
这里是整个项目的包,项目名是TTS,上传的时候改了下
https://pan.baidu.com/s/1dFovUz3

老师 发表于 2017-6-16 17:14:59

ba21 发表于 2017-6-16 11:33
兄弟,跟你说得这么详细了还不能结贴?你的50B也太难挣了吧。

我也想早点解决啊,好久了都,但正如截图,它就是这样
页: [1] 2
查看完整版本: C++调用sapi.h在无VS2015的机器上报0xc000007b