| Thread overview | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
October 14, 2008 COMSTL vs. MinGW: compiling error | ||||
|---|---|---|---|---|
| ||||
Hi,
I encountered a problem while I tried to complile C++ source codes
(listed below). I use MinGW-5.1.4 [GCC 3.4.5 (mingw-vista special r3)]
for compiling under Windows XP Pro. (SP2) and STLSoft 1.9.57. The error
I got is as follows:
>\MinGW\bin\g++.exe -c -I\MinGW\include -I\stlsoft-1.9.57\include -I"\Microsoft
Speech SDK 5.1\Include" test.cpp
/stlsoft-1.9.57/include/comstl/util/creation_functions.hpp: In function `HRESULT stlsoft::comstl_project::co_create_instance(const CLSID&, I**, DWORD) [with I = ISpVoice]':
/stlsoft-1.9.57/include/comstl/util/creation_functions.hpp:222: instantiated from `HRESULT stlsoft::comstl_project::co_create_instance(const CLSID&, stlsoft::ref_ptr<T, I, U>&, DWORD) [with T = ISpVoice, I = ISpVoice, U = ISpVoice]'
test.cpp:19: instantiated from here
d:/cygwin/home/chinfu/Sandbox/stlsoft-1.9.57/include/comstl/util/creation_functions.hpp:128: error: incomplete type `stlsoft::comstl_project::IID_traits<ISpVoice>' used in nested name specifier
I've tried googling but no luck. Could someone help me out?
Thanks in advance.
Chinfu
C++ source codes:
-----------------
#include <windows.h>
#include <servprov.h>
#include <sapi.h>
#include <string>
#include <iostream>
#include <comstl/error/exceptions.hpp>
#include <comstl/util/initialisers.hpp>
#include <comstl/util/creation_functions.hpp>
#include <stlsoft/smartptr/ref_ptr.hpp>
#include <winstl/conversion/char_conversions.hpp>
//COMSTL_IID_TRAITS_DEFINE(ISpVoice)
class mySpeech {
public:
mySpeech() {
static comstl::com_initializer coinit;
HRESULT hr;
if(FAILED(hr = comstl::co_create_instance(CLSID_SpVoice,_pVoice)))
throw comstl::com_exception("Failed to create SpVoice COM instance",hr);
}
int sayit(const char* s, int n) {
std::string(s,n);
_pVoice->Speak(winstl::a2w(s), SPF_ASYNC, 0);
return n;
}
void setRate(long n) { _pVoice->SetRate(n); }
private:
stlsoft::ref_ptr<ISpVoice> _pVoice;
};
// main
int main() {
class mySpeech *msp;
try {
msp = new mySpeech();
} catch (comstl::com_exception &e){
std::cerr<< "error";
}
string s("hello world");
msp.sayit(s);
return 0;
}
| ||||
October 14, 2008 Re: COMSTL vs. MinGW: compiling error | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Chinfu | Hi,
It's me again. I found my mistake. By adding "namespace stlsoft{ namespace comstl{...} }" around the macro COMSTL_IID_TRAITS_DEFINE(ISpVoice), I've compiled it without error.
(I also corrected some errors in souce codes in the previous post.)
But I got the following 'warning' while linking,
Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized
And there is no output while I run the generated execution file. Any help is appreciated. The source codes are listed below.
Chinfu
---
#include <windows.h>
#include <servprov.h>
#include <sapi.h>
#include <string>
#include <iostream>
#include <comstl/error/exceptions.hpp>
#include <comstl/util/initialisers.hpp>
#include <comstl/util/creation_functions.hpp>
#include <stlsoft/smartptr/ref_ptr.hpp>
#include <winstl/conversion/char_conversions.hpp>
namespace stlsoft {
namespace comstl_project {
COMSTL_IID_TRAITS_DEFINE(ISpVoice)
}
}
class mySpeech {
public:
mySpeech() {
static comstl::com_initializer coinit;
HRESULT hr;
if(FAILED(hr = comstl::co_create_instance(CLSID_SpVoice,_pVoice)))
throw comstl::com_exception("Failed to create SpVoice COM instance",hr);
}
int sayit(const char* s, int n) {
std::string(s,n);
_pVoice->Speak(winstl::a2w(s), SPF_ASYNC, 0);
return n;
}
void setRate(long n) { _pVoice->SetRate(n); }
private:
//COM object smart pointer
stlsoft::ref_ptr<ISpVoice> _pVoice;
};
// Main
int main() {
class mySpeech *msp;
try {
msp = new mySpeech();
} catch (comstl::com_exception &e){
std::cerr<< "error";
}
const char* str="hello, world";
msp->sayit(str,13);
return 0;
}
| |||
October 15, 2008 Re: COMSTL vs. MinGW: compiling error | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Chinfu | Am taking a look at this now. btw, have you looked at VOLE: http://vole.sourceforge.net/. It simplifies the use of COM Automation a whole lot Matt "Chinfu" <chinfu.ku@gmail.com> wrote in message news:gd1kht$1otn$1@digitalmars.com... > Hi, > It's me again. I found my mistake. By adding "namespace stlsoft{ namespace comstl{...} }" around the macro COMSTL_IID_TRAITS_DEFINE(ISpVoice), I've compiled it without error. > (I also corrected some errors in souce codes in the previous post.) > > But I got the following 'warning' while linking, > Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized > > And there is no output while I run the generated execution file. Any help is appreciated. The source codes are listed below. > > Chinfu > > --- > #include <windows.h> > #include <servprov.h> > #include <sapi.h> > #include <string> > #include <iostream> > #include <comstl/error/exceptions.hpp> > #include <comstl/util/initialisers.hpp> > #include <comstl/util/creation_functions.hpp> > #include <stlsoft/smartptr/ref_ptr.hpp> > #include <winstl/conversion/char_conversions.hpp> > > namespace stlsoft { > namespace comstl_project { > COMSTL_IID_TRAITS_DEFINE(ISpVoice) > } > } > > class mySpeech { > public: > mySpeech() { > static comstl::com_initializer coinit; > HRESULT hr; > if(FAILED(hr = comstl::co_create_instance(CLSID_SpVoice,_pVoice))) > throw comstl::com_exception("Failed to create SpVoice COM instance",hr); > } > int sayit(const char* s, int n) { > std::string(s,n); > _pVoice->Speak(winstl::a2w(s), SPF_ASYNC, 0); > return n; > } > void setRate(long n) { _pVoice->SetRate(n); } > private: > //COM object smart pointer > stlsoft::ref_ptr<ISpVoice> _pVoice; > }; > // Main > int main() { > class mySpeech *msp; > try { > msp = new mySpeech(); > } catch (comstl::com_exception &e){ > std::cerr<< "error"; > } > const char* str="hello, world"; > msp->sayit(str,13); > return 0; > } > | |||
October 15, 2008 Re: COMSTL vs. MinGW: compiling error | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Matthew Wilson | "Matthew Wilson" <matthew@hat.stlsoft.dot.org> wrote in message news:gd5jmp$1p2f$1@digitalmars.com... > Am taking a look at this now. > > btw, have you looked at VOLE: http://vole.sourceforge.net/. It simplifies the use of COM Automation a whole lot Scratch that. SAPI does not support automation (IDispatch). Sorry for the misdirect | |||
October 15, 2008 Re: COMSTL vs. MinGW: compiling error | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Matthew Wilson | "Matthew Wilson" <matthew@hat.stlsoft.dot.org> wrote in message news:gd5l7s$1rlt$1@digitalmars.com... > > "Matthew Wilson" <matthew@hat.stlsoft.dot.org> wrote in message news:gd5jmp$1p2f$1@digitalmars.com... > > Am taking a look at this now. > > > > btw, have you looked at VOLE: http://vole.sourceforge.net/. It simplifies the use of COM Automation a whole lot > > Scratch that. SAPI does not support automation (IDispatch). Sorry for the misdirect Doh! Wrong again. It does. I'm writing a couple of examples of how to do all this ... be with you shortly. Matt | |||
October 15, 2008 Driving MS Speech API (SAPI) (was Re: COMSTL vs. MinGW: compiling error) | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Matthew Wilson | > > > btw, have you looked at VOLE: http://vole.sourceforge.net/. It simplifies the use of COM Automation a whole lot > > I'm writing a couple of examples of how to do all this ... be with you shortly. I've written up an example using ISpVoice directly, and it fails to talk for me also. I will try and find out why. In the meantime, here's an example using VOLE. #include <vole/vole.hpp> #include <comstl/util/initialisers.hpp> #include <iostream> int main(int /* argc */, char** /* argv */) { try { comstl::com_initialiser coinit; vole::object speaker = vole::object::create("SAPI.SpVoice"); #if defined(STLSOFT_COMPILER_IS_MSVC) && \ _MSC_VER < 1310 // VC++ 6 cannot use the "normal" VOLE way of explicitly // specialising the method function template on return type, so // we have to use invoke_method_v() speaker.invoke_method_v(L"Speak", "I have something to say!", 0); #else /* ? _DEBUG */ // The "normal" VOLE way speaker.invoke_method<void>(L"Speak", "I have something to say!", 0); #endif /* _DEBUG */ return EXIT_SUCCESS; } catch(std::bad_alloc&) { std::cerr << "out of memory" << std::endl; } catch(vole::vole_exception& x) { std::cerr << "operation failed: " << x.what() << ": " << winstl::error_desc_a(x.hr()) << std::endl; } catch(std::exception& x) { std::cerr << "operation failed: " << x.what() << std::endl; } catch(...) { std::cerr << "unexpected condition" << std::endl; } return EXIT_FAILURE; } I'm also doing a FastFormat version. I'll put them all up on the STLSoft wiki site shortly. HTH Matt | |||
October 15, 2008 Re: Driving MS Speech API (SAPI) - FastFormat example | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Matthew Wilson | Here's the FastFormat example (with error-handling elided) #include <fastformat/fastformat.hpp> #include <fastformat/sinks/speech.hpp> int main(int argc, char** argv) { { // Say one thing only fastformat::write(fastformat::speech_sink(), "I have something to say!"); } { // Say several things fastformat::speech_sink speaker; fastformat::write(speaker, "I have something to say!"); fastformat::write(speaker, "I have something else to say!"); } return EXIT_SUCCESS; } | |||
October 15, 2008 Re: Driving MS Speech API (SAPI) - why SAPI example doesn't speak | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Matthew Wilson | If you look again at the code
class mySpeech {
public:
mySpeech() {
static comstl::com_initializer coinit;
HRESULT hr;
if(FAILED(hr = comstl::co_create_instance(CLSID_SpVoice,_pVoice)))
throw comstl::com_exception("Failed to create SpVoice COM instance",hr);
}
int sayit(const char* s, int n) {
std::string(s,n);
_pVoice->Speak(winstl::a2w(s), SPF_ASYNC, 0);
return n;
}
void setRate(long n) { _pVoice->SetRate(n); }
private:
//COM object smart pointer
stlsoft::ref_ptr<ISpVoice> _pVoice;
};
// Main
int main() {
class mySpeech *msp;
try {
msp = new mySpeech();
} catch (comstl::com_exception &e){
std::cerr<< "error";
}
const char* str="hello, world";
msp->sayit(str,13);
return 0;
}
This fails to speak because:
- the call to sayit() is made immediately before the program exits.
- the Speak() command is passed the SPF_ASYNC flag, which causes the speech to be executed on a worker thread
So the reason if fails to speak is because the program exits before it can get it out.
There are two ways to make this speak:
- add a Sleep() call after sayit() - 1.5 seconds is required on my system to get out the whole sentence
- change SFP_ASYNC to SPF_DEFAULT, causing the Speak() call to be synchronous
HTH
Matt
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply