|
Hi Marc,
Absolutely. I believe the PlaySound Function[^] is exported from winmm.dll and is a wrapper for PlaySoundW so you could just hook PlaySoundW and get both. The Microsoft Detours[^] works very well although I believe it requires a licence for commercial use. There are also many free libraries (some here on codeproject) but your product support with free libraries may be limited or non-existent.
Best Wishes,
-David Delaune
|
|
|
|
|
Greetings, I'm using MS SAPI for speech recognition in my project. I have the TTS and
the Standard Speech Recognition working perfectly, but I'm now trying to use the
dynamic Grammar interface or the "grammar builder".
The problem I think is with the ISpGrammarBuilder pointer that I am using in this code snipped:
CComPtr<ISpGrammarBuilder> cpGrammarBuilder;
SPSTATEHANDLE hStateTravel;
hr = cpGrammarBuilder->GetRule(L"Travel", 0, SPRAF_TopLevel | SPRAF_Active, TRUE, &hStateTravel);
I'm basing this code on this MS example code.
The code compiles correctly but I always get this Debug Assertion Failure on line 172 in atlcomcli.h or this function:
_NoAddRefReleaseOnCComPtr<T>* operator->() const throw()
{
ATLASSERT(p!=NULL);
return (_NoAddRefReleaseOnCComPtr<T>*)p;
}
Can anyone tell me what this function does? and if I'm using this ISpGrammarBuilder pointer correctly?
Any help is greatly appreciated
|
|
|
|
|
You never assign the pointer a value - that's why you get the assertion failure. The Microsoft example omits that rather important step
Largo65 wrote:
_NoAddRefReleaseOnCComPtr<T>* operator->() const throw()
{
ATLASSERT(p!=NULL);
return (_NoAddRefReleaseOnCComPtr<T>*)p;
}
Can anyone tell me what this function does? and if I'm using this ISpGrammarBuilder pointer correctly?
This function implements CComPtr 's operator-> , allowing you to use the underlying interface pointer's methods through the managed pointer. All it needs to do is return something which also has an operator-> , whether implicitly defined (i.e. a pointer) or explicitly defined (a struct/class).
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
I was a little bit bored and tried this inline asm example:
Calling C Functions in Inline Assembly MSDN
But I get this error :
"Unhandled exception at ... Access violation writing location..."
at the instruction after the call instruction, even if I insert a NOP there.
Started with a vs2005 win32 console project and I copy pasted the code in "main" to my "_tmain" function
and declared the strings outside the main function
Another function that I created before did work (I think, didn't got any errors ):
int increase (int a)
{
return ++a;
}
....
push 1
call increase
pop ebx
|
|
|
|
|
This is happening because you are dynamically linking with the C runtime. Change the assembly code in the Microsoft example to:
call DWORD PTR printf
Another way to fix it is to change your C runtime linking to /MT or /MTd
Best Wishes,
-David Delaune
|
|
|
|
|
thankyouverymuch , works now.
now I just have to figure out why it works
call printf
call DWORD PTR printf
So does this means that the first call instruction wants to use the "__imp__printf" directly
as an address where the printf function is?
And the second call instruction uses __imp__printf as a pointer to this addres?
I suppose it is like this because the address of the printf function is unkown before runtime
because the library is dynamically linked?
|
|
|
|
|
Sounds like you pretty much understand why the Microsoft sample failed. Here is an old MSDN article with more info:
__declspec(dllimport) and __declspec(dllexport)[^]
invader82 wrote: now I just have to figure out why it works
Ahhh but isnt it great learning something new? Here are two more ways you could have fixed the Microsoft sample assembly code. I leave it as an excercise to the reader to figure out why it works.
[Method 1]
call dword ptr [esi+printf]
[Method 2]
mov esi,printf
call esi
Feeling like a programming dinosaur,
-David Delaune
|
|
|
|
|
thx for the article very usefull
Method 1 doesn't work and I don't see how it could work.
It uses the value of esi as a base address and adds the printf function address to it
I guess this would only work if esi == 0
method 2 is quite straight forward. it just puts the address of the function into esi
and performs an indirect call to that function using the addres in esi.
thanks anyway
|
|
|
|
|
|
|
Gajendra Sharma wrote: Is it true also for Unix Sockets
It is.
|
|
|
|
|
Gajendra Sharma wrote: Is it true also for Unix Sockets?
Sockets are not platform/OS dependent.
It is a crappy thing, but it's life -^ Carlo Pallini
|
|
|
|
|
Gajendra Sharma wrote: Is it true also for Unix Sockets?
Yes.
The Microsoft implementation was originally designed/derived from Unix Berkeley sockets[^] and for the most part they are compatiable. There have been many Windows specific extensions in Microsoft Winsock2 but for standard TCP/IP and UDP they are nearly identical implementations.
Best Wishes,
-David Delaune
|
|
|
|
|
Thanks all for the valuable replies.
Best Regards.
Gajendra Sharma
Gajendra
|
|
|
|
|
I want to use an ocx in Vista session 0 using hidden window/dialog. This is giving me crash consistently. Has anyone tried this successfully?
|
|
|
|
|
Hello,
i have the following problem that i want to describe with codesnippets:
i have the class CGCxPageElement. Its the Base class of CGCxPane:
class CGCxPageElement : public CGCxHtmlTemplate {
DECLARE_DYNCREATE(CGCxPageElement)
public:
CGCxPageElement();
CGCxPageElement(const CGCxPageElement &e) {
m_strTemplate = e.m_strTemplate;
m_strContent = e.m_strContent;
}
CGCxPageElement& operator=(const CGCxPageElement &e) {
m_strTemplate = e.m_strTemplate;
m_strContent = e.m_strContent;
return *this;
}
virtual ~CGCxPageElement();
protected:
CString m_strContent;
public:
virtual void SetContent(CString strContent);
virtual void SetContent(UINT nIDResource);
virtual CString MakeHtml();
};
class CGCxPane : public CGCxPageElement {
DECLARE_DYNCREATE(CGCxPane)
public:
CGCxPane();
CGCxPane(const CGCxPane &e) {
m_strTemplate = e.m_strTemplate;
m_strContent = e.m_strContent;
m_strTitle = e.m_strTitle;
}
CGCxPane& operator=(const CGCxPane &e) {
m_strTemplate = e.m_strTemplate;
m_strContent = e.m_strContent;
m_strTitle = e.m_strTitle;
return *this;
}
virtual ~CGCxPane();
protected:
CString m_strTitle;
public:
void SetTitle(CString strTitle);
virtual CString MakeHtml();
};
then i have an array of CGCxPageElement objects. i have to add GCxPane and other Object inherited from CGCxPageElement to it:
CArray<CGCxPageElement, CGCxPageElement&> m_Elements;
now here comes the problem: inside another class i want to go through the CGCxPageElement array and call the method MakeHtml, but not that one of the base class but of the child e.g. CGCxPane
for (int i = 0; i < m_Elements.GetCount(); i++) {
CGCxPageElement elem = m_Elements[i];
strContent.Append(elem.MakeHtml());
}
1. how can i find out what class is stored in m_Elements originally?
2. how can i call the MakeHtml() method of this class and not of the base class?
i am not a pro in inheritance...but for now i am stuck. any casting like
CGCxPane pane = (CGCxPane) m_Elements[i];
does not work and i don't want to hadrcode the CGCxPane inside because there will be some more CGCxPageElement object not only CGCxPane.
any help would be much appreciated!
regards,
rudi
|
|
|
|
|
That's exactly the purpose of polymorphism. What you have to store in your array, is in fact pointers to the base class:
CArray<CGCxPageElement*> m_Elements;
Then if you have several different children of CGCxPageElement, you can simply create them and store them in the array (a pointer to a child class is also a pointer to the base class):
CGCxPageElement* pNewElement = new CGCxPane();
m_Elements.Add(pNewElement);
Then, if you make your MakeHtml function virtual, you can simply iterate over the array and call the function. It will automatically call the function from the correct type.
Don't forget to delete the elements from the array when you remove them.
I suggest you search a bit for polymorphism and C++ to have a better understanding of it.
|
|
|
|
|
Hello Cedric,
thank you very much for your answer. i changed my array to a pointer array and now evertything works like it should. i knew the answer was pretty trivial but i somehow got stuck in the code
i have have more and more to get used to the whole pointer and polymorphism stuff in c++.
@sashoalm: thank you for the link. when i have some time left i will have a deeper look on polymorphism...
regards,
rudi
|
|
|
|
|
That's what virtual functions[^] are for
There is sufficient light for those who desire to see, and there is sufficient darkness for those of a contrary disposition.
Blaise Pascal
|
|
|
|
|
Hello All,
I have stucked in this problem.
I have a PMD Camera , How can I read the streaming and send any captured image to the server using WLAN in VC++ ?
Any start help pr sample code will be very helpfull.
Regards
|
|
|
|
|
|
Hi,
Is there any SDK or API which gives me the FILE Pointer to the file which is zipped inside another file. Basically I have couple of files which are winzipped and password protected. I want to FILE pointer to file which is inside the zip file. We have similar kind of functionality in sharpziplib which gives stream of file which is inside the zip file. sharpziplib is available in C#. Is there any SDK or libarary or API which is available to implement such kind of functionality in C++.
thanks,
Umrahi
If you have faith in the cause and
the means and in God, the hot
Sun will be cool for you.
|
|
|
|
|
I'm not sure about FILE* pointer, but if you want to extract the file see Minizip[^].
There is sufficient light for those who desire to see, and there is sufficient darkness for those of a contrary disposition.
Blaise Pascal
|
|
|
|
|
thanks for reply...
It seems it is not a managed code or compatible with visual studio 2008... Can you show me any library which is compatible with Visual studio 2008
thanks again
If you have faith in the cause and
the means and in God, the hot
Sun will be cool for you.
|
|
|
|
|
Hi ,
I am using this RasSetEntryProperties() function to write entries in phone book.
In Windows Xp machine i got all the properties properly.
But in Vista machine these following etries are not been created.
PhoneNumber=
AreaCode=
CountryCode=1
CountryID=1
UseDialingRules=0
Comment=
Can you please let me know what is the difference in vista in this context?
Thanks in advance...................
Birajendu
SonicWALL
Bangalore
India
|
|
|
|