Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C++ Builder ScriptControl sa VBScriptom

[es] :: C/C++ programiranje :: C++ Builder ScriptControl sa VBScriptom

[ Pregleda: 1847 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

-pixi-
dk

Član broj: 134302
Poruke: 23
*.virnxx10.adsl-dhcp.tele.dk.



Profil

icon C++ Builder ScriptControl sa VBScriptom15.02.2007. u 14:17 - pre 221 meseci

Molim vas ako iko moze da pomogne, pomozite mi.
Znaci dobio sam zadatak da implementiram neki manji program. Treba da ga implementiram u Borland C++ Builderu (verzija 5.1).
Zadatak mi je da putem Microsoft-ovog ScriptControl-a zovem metode nekog VBScript-a i nazad. Znaci za sada u jednom TMemo imam dvije metode, Hello() i Goodbye() koje trebaju da uzmu parametre iz aplikacije i da pokazu jedan novi prozorcic u kojem pise "Hello Kevin" i "Goodbye Kevin". Samo jos da dodam da Edit1->Text sadrzi ime na pr. "Kevin" a Edit2->Text sadrzi ime metode tj. Hello() ili Goodbye().

Za sad mi kod za zvanje VBScript metode izgleda ovako:

Code:

  LPSAFEARRAY *pSa; // Holds the name parameter
  Variant varParameters;

  varParameters = VarArrayCreate(OPENARRAY(int,(1, 1)), varVariant);

  varParameters.PutElement(this->Edit1->Text,1);

  // varParameters arrayet handed to the safeArrayet
  pSa = varParameters.pparray;


  // Convert the AnsiString from Edit1(name) to wChar
  wchar_t *methodName;
  wchar_t *ThisVariableHasNoFunctionOtherThenToAssureThatmethodNameIsntOverwritten;
  AnsiString editStr = Edit2->Text;
  editStr.WideChar(methodName, editStr.WideCharBufSize());


  // Convert the AnsiString from Memo1 to wChar
  wchar_t *wcharTextMemo;
  AnsiString str = Memo1->Text;
  str.WideChar(wcharTextMemo, str.WideCharBufSize());


  // Add code to the ScriptControl
  this->ScriptControl1->AddCode(wcharTextMemo);
  // Run the script specified within the wchar_t ProcedureName with the
  // parameters specified in tagSAFEARRAY Parameters
  this->ScriptControl1->Run(methodName, pSa);


Program radi kako treba dok ne dodje do zadnje linije i zove Run metodu, gdje crash-a jer mi je pSa cini mi se prazan. Takodje imam problem sa wideChar-ovima jer jedan prepise drugi, ako ne uvedem ThisVariableHasNoFunctionOtherThenToAssureThatmethodNameIsntOverwritten.

Znaci molim nekoga, ko je radio sa ovim ranije ili ako moze da sazna kako mogu da rijesim ovaj problem, da mi pomogne

Unaprijed puno hvala
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4939
*.tekostolac.co.yu.



+646 Profil

icon Re: C++ Builder ScriptControl sa VBScriptom16.02.2007. u 13:31 - pre 221 meseci
Da ne ulazim dublje u analizu moraju li ti Variant-i itd, ali ono što je očigledno pogrešno
je to što na dva mesta *ne* rezervišeš potreban prostor gde ćeš smestiti wchar_t.

Umesto:
Citat:

wchar_t *methodName;
wchar_t *ThisVariableHasNoFunctionOtherThenToAssureThatmethodNameIsntOverwritten;
AnsiString editStr = Edit2->Text;
editStr.WideChar(methodName, editStr.WideCharBufSize());

Pokušaj ovo /netestirano/:
Code:

AnsiString editStr = Edit2->Text;
int size = editStr.WideCharBufSize();
wchar_t *methodName = new wchar_t[ size ];
editStr.WideChar( methodName, size );

// OVDE TVOJ KOD ... Run() ...

delete [] methodName; // <--- Ovo tek na kraju, kad ti više methodName ne treba

Ovde je ista greška:
Citat:

// Convert the AnsiString from Memo1 to wChar
wchar_t *wcharTextMemo;
AnsiString str = Memo1->Text;
str.WideChar(wcharTextMemo, str.WideCharBufSize());

Trebalo bi /netestirano/:
Code:

AnsiString str = Memo1->Text;
int size_m = str.WideCharBufSize();
wchar_t *wcharTextMemo = new wchar_t[ size_m ];
str.WideChar( wcharTextMemo, size_m );

// OVDE TVOJ KOD ... Run() ...

delete [] wcharTextMemo; // <--- Ovo tek na kraju, kad ti više wcharTextMemo ne treba


Napomena: U drugom slučaju (ovo sa Memo1) uzimaš CEO tekst (Memo1->Text), tj sve linije i pretvaraš
u wchar_t. Da li je to baš to što želiš, ili je potrebno liniju po liniju?

Generalno, ovde si imao probleme sa alokacijom prilikom konverzije iz AnsiString u wchar_t.
Postoje i lakši načini da to odradiš, pa po želji možeš da modifikiješ gornji kod:
Code:

AnsiString str = "proba"; 
wchar_t *WS = StringToOleStr( str );

ili:
Code:

AnsiString str = "proba"; 
wchar_t *WS = WideString( str ).Copy();




[Ovu poruku je menjao X Files dana 16.02.2007. u 15:21 GMT+1]
 
Odgovor na temu

-pixi-
dk

Član broj: 134302
Poruke: 23
*.virnxx10.adsl-dhcp.tele.dk.



Profil

icon Re: C++ Builder ScriptControl sa VBScriptom19.02.2007. u 09:05 - pre 221 meseci
Kao prvo hvala puno na odgovoru

Znaci sad sam prepravio kod koristeci vas wchar_t *methodName = new wchar_t[ size ]; sto mi je pomoglo fa uklonim ovaj dugacki variable ThisVariableHasNoFunctionOtherThenToAssureThatmethodNameIsntOverwritten. Pokusao sam takodje koristiti wchar_t *WS = StringToOleStr( str ); i wchar_t *WS = WideString( str ).Copy();, ali mi ovo nije pomoglo jer ove funkcije samo kopiraju prvi char u AnsiString-u.

Meni se jos uvjek cini da LPSAFEARRAY *pSa ne sadrzi prave infomacije tj. parametre koji se u SAFEARRAY-u trebaju predati metodi ScriptControl1->Run().

U sustini ja ne znam dali je ovo pravi nacin na koji ovo treba da se uradi, moze li biti da se putem nekih COM-objekata uradi ista stvar bez ScriptCOntrol-a!?
 
Odgovor na temu

-pixi-
dk

Član broj: 134302
Poruke: 23
195.41.172.*



Profil

icon Re: C++ Builder ScriptControl sa VBScriptom20.02.2007. u 10:35 - pre 221 meseci

Odlucio sam ipak da odustanem od koristenja ScriptControl1->Run umjesto toga cu koristiti ScriptControl1->ExecuteStatement. Neznam bas u cemu je razlika ali ova radi ono sto mi treba i za sad je uredu.
Kreirao sam sada jedan Automation object koji treba da omoguci zvanje metoda aplikacije iz VBScript-a. Da bih to mogao uraditi moram registrovati kreirani Automation object sa metodom ScriptControla1->addObject(wchar_t Name, IDispatch Object, TOLEBOOL AddMembers).

Znaci, imam jednu klasu koja implementira IDispatch ali ne znam kako da u drugoj klasi napravim instansu ove klase. Moze li neko pomoci? Hvala unaprijed
 
Odgovor na temu

[es] :: C/C++ programiranje :: C++ Builder ScriptControl sa VBScriptom

[ Pregleda: 1847 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.