Problem z OLE. Przeniesienie kodu z Delhpi pod C

0

Cześć mam problem z przeniesieniem kodu z Object pascala do języka C. Uzywam kompilatora Dev-Cpp

Oto kod Delphi:

Voice: OLEVariant;
Voice := CreateOLEObject('SAPI.SpVoice');
Voice.Speak(Memo1.text, 0);

Oto kod który napisałem do C

#include <objbase.h>
#include <windows.h>

int main(int argc, char *argv[])
{
VARIANT voice;
CLSID clsid;
REFIID rid;

OleInitialize(NULL);
CLSIDFromProgID(OLESTR("SAPI.SpVoice"), &clsid);
CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER ||
CLSCTX_LOCAL_SERVER, rid, (LPVOID *) &voice);

voice.Speak("Hello",0);
OleUninitialize();
system("PAUSE");
return 0;
}

Wyskakuje mi bład tylko w voice.Speak("Hello",0); nie znajduje struktury.

Jak rozwiązać ten problem?

0

Po pierwsze voice nie jest variantem tylko interface-pointerem
rid - nie zainicjowałeś. Może to być IDispatch, albo lepiej ISpeechVoice.

interface jest zdefiniowane w typelib "Microsoft Speech Object Library"
program files/common files/Microsoft Shared/Speech/sapi.dll

main{
	CLSID  clsid;
	REFIID rid;
	ISpeechVoice *voice;
//uuid(269316D8-57BD-11D2-9EEE-00C04F797396),
//helpstring("ISpeechVoice Interface"), dual
	CLSIDFromString(L"{269316D8-57BD-11D2-9EEE-00C04F797396}", &rid);
	OleInitialize(NULL);
	CLSIDFromProgID(L"SAPI.SpVoice", &clsid);

	CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &rid, &voice);

	long temp;
	BSTR bstrText = SysAllocString(L"Heeeelloooo");
	voice->Speak(bstrText, 0, &temp);
	SysFreeString(bstrText);
0

Zróbiłem jak mi podałeś przykład ale znowu wyskakują błedy:
main.c warning: passing arg 1 of CLSIDFromString' from incompatible pointer type main.c:17: warning: passing arg 2 of CLSIDFromString' from incompatible pointer type
main.c warning: passing arg 1 of CLSIDFromProgID' from incompatible pointer type main.c:21: warning: passing arg 4 of CoCreateInstance' from incompatible pointer type
main.c warning: passing arg 5 of CoCreateInstance' from incompatible pointer type main.c:24: warning: passing arg 1 of SysAllocString' from incompatible pointer type
main.c error: invalid type argument of `->'

0

Wybrałeś cpp, ale chyba nie znasz jego rygoru, skoro takie błache błędy są problemem. Wiem że to wina twórców parsera, ale kto za darmo zrobi coś dobrego?

Sam powinieneś wiedzieć że typ argumentu musi być taki jak zdefiniowano w .h, więc porównaj to co sam napisałeś z tym moim i dopisz cast'y:

CLSIDFromString( (LPOLESTR)L"blah",
// albo
CLSIDFromString( OLESTR("blah"),

Jeśli się czepi do &rid to castuj (LPCLSID)&rid.
&voice też musisz castować na void**

0

Chce to wszytsko napisać w czystym C, nie używając CPP, a w czystym WinAPI dopiero zaczynam programować i poznawać. Ogólnie skupiam się na poznaniu ANSI C. Chce tworzyć programy wieloplatformowe z wyjątkiem jest speech.

0

Oto mój nowy kod, ale dalej mi wywala błąd:
Podkreslam że chce to napisac w czystym C

#include <windows.h>
#include <oleauto.h>
#include <objbase.h>
#include <sapi/sapi.h>

int main(int argc, char *argv[])
{
CLSID clsid;
REFIID *rid;
SpVoice *voice;
//uuid(269316D8-57BD-11D2-9EEE-00C04F797396),
//helpstring("ISpeechVoice Interface"), dual
CLSIDFromString(OLESTR("{269316D8-57BD-11D2-9EEE-00C04F797396}"), (LPCLSID) &rid);
OleInitialize(NULL);
CLSIDFromProgID((LPOLESTR)"SAPI.SpVoice", (LPCLSID)&clsid);

    CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, (LPCLSID)&rid, (void **)&voice);

    long temp;
    BSTR bstrText = SysAllocString(OLESTR("Heeeelloooo"));
    voice->Speak(bstrText, 0, (long *)&temp);
    SysFreeString(bstrText);

system("PAUSE");
return 0;
}

</span>

Błąd:

ompilator: Default compiler Building Makefile: "D:\Programmers\Dev-Cpp\Makefile.win" Wykonywanie make... make.exe -f "D:\Programmers\Dev-Cpp\Makefile.win" all gcc.exe -c main.c -o main.o -I"D:/Programmers/Dev-Cpp/include"

main.c: In function `main':
main.c error: dereferencing pointer to incomplete type

make.exe: *** [main.o] Error 1

Wykonanie zakończone

</span>
0
sapero napisał(a)

[...] Wiem że to wina twórców parsera, ale kto za darmo zrobi coś dobrego?

No niezupełnie. W CLSIDFromString pierwszy parametr jest typu LPOLESTR, a dostaje de facto LPCOLESTR... więc jak już to wina będzie po stronie tych co pisali prototypy funkcji ;) Zapewne w opcjach kompilatora można ustawić to jak ma reagować na tego typu niezgodności.

0

w c virtualne metody wywołuje sie jawnie: voice->lpVtbl->Speak(voice, ...);

1 użytkowników online, w tym zalogowanych: 0, gości: 1