CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [BCB6] Problem z wyłączaniem programu i kodowaniem
Strona 1 z 1

[BCB6] Problem z wyłączaniem programu i kodowaniem

Nowy postNapisane: czwartek, 7 kwietnia 2011, 16:14
przez areq47
Witam,
Piszę program do obsługi poczty email. Korzystam z C++ Builder 6 i komponentów TIDMessage, TIDPop3, TIDSmtp, CppWebBrowser.

Pocztę pobieram do Memo i z memo wyświetlana jest w CppWebBrowser. Robiłem to jak w przykładzie Cyfrowego Barona:

KOD cpp:     UKRYJ  
TMemoryStream *stm = new TMemoryStream();
WiadomoscMemo->Lines->SaveToStream(stm);

IPersistStreamInit *psi;
stm->Seek(0, 0);

TStreamAdapter *sa = new TStreamAdapter(stm, soReference);

if (SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi)))
    psi->Load(*sa);

delete stm;


i podczas tworzenia formularza (onCreate):
KOD cpp:     UKRYJ  
CppWebBrowser1->Navigate(WideString( "about:blank" ));


Wszystko dobrze działa, ale przy wyłączaniu programu pokazuje się błąd:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at adress 0040235B in module 'Project1.exe'. Read of adress 00000000'. Process stopped. Use Srep or Run to continue.



Builder podświetla linijkę, która powoduje błąd:
KOD cpp:     UKRYJ  
if (SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi)))


Co w tym wypadku może być źle?

Czy macie może jakiś sposób na zmianę kodowania na UTF-8 w CppWebBrowserze? Czasami maile mają dobre kodowanie, a czasami złe.

//EDIT Zauważyłem że tego błędu nie ma, jak wyłączam program przy braku wczytanego maila do cppwebbrowser (kiedy jest pusta)

Re: [BCB6] Problem z CPPWebBrowser

Nowy postNapisane: czwartek, 7 kwietnia 2011, 16:43
przez Cyfrowy Baron
Z tego co jeszcze pamiętam odnośnie C++Builder 6, to ten błąd pojawiał się zawsze gdy w aplikacji używało się kontrolki TCPPWebBrowser i komponentów INDY. Jedno z drugim się gryzie... Kontrolka CPPWebBrowser w środowisku C++Builder będzie powodować więcej problemów, ale z tego co się orientuję to tylko w wersji Personal.

Sprawdź czy masz takie wpisy w pliku źródłowym:

KOD cpp:     UKRYJ  
//  MSHTML INTERFACE
#include <mshtmhst.h>
#include <mshtmcid.h>
#include <Mshtml.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)

#pragma link "shdocvw_ocx"
#pragma link "shdocvw"

#pragma resource "*.dfm"


Jeżeli nie to je dodaj, być może to pomoże.

Re: [BCB6] Problem z CPPWebBrowser

Nowy postNapisane: czwartek, 7 kwietnia 2011, 17:12
przez areq47
Niestety dołączenie tych wpisów nie pomogło.
Mam wersję C++ Builder 6 Professional.

Czy jest może inny komponent niż cppwebbrowser, który mógłby wyświetlać te maile?? Ew. inne komponenty do odbierania maili (takie żeby się razem nie gryzły)?

Re: [BCB6] Problem z CPPWebBrowser

Nowy postNapisane: czwartek, 7 kwietnia 2011, 17:48
przez Cyfrowy Baron
TCppWebBrowser nie jest komponentem, lecz kontrolką ActiveX bazującą na bibliotekach przeglądarki IE. Nigdy nie zetknąłem się z niczym podobnym do tej kontrolki.

By się upewnić, że błąd wywołuje pakiet INDY stwórz testową aplikację tylko z TCppWebBrowser bez INDY.

W nowszych wersjach środowiska ten problem nie występuje.

Re: [BCB6] Problem z CPPWebBrowser

Nowy postNapisane: czwartek, 7 kwietnia 2011, 18:00
przez areq47
Obszedłem ten problem trochę naokoło. Podczas zamykania aplikacji wyświetlam pustą stronę w cppwebbrowser i czyszczę memo. W takim wypadku nie ma błędu ;)

Może ma ktoś pomysł z tym kodowaniem UTF-8 (polskie znaki)??

Re: [BCB6] Problem z CPPWebBrowser

Nowy postNapisane: czwartek, 7 kwietnia 2011, 18:24
przez Cyfrowy Baron
Ja stworzyłem sobie taką funkcję dekodujące:

KOD cpp:     UKRYJ  
String __fastcall Decode_ISO_88591(String webText)
{
 webText = StringReplace(webText, "+", " ", TReplaceFlags() << rfReplaceAll);

 String tabLitery =
   L"ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ";

 String tabSymbole[] = {
 "Agrave", "Aacute", "Acirc", "Atilde", "Auml", "Aring", "AElig", "Ccedil",
 "Egrave", "Eacute", "Ecirc", "Euml", "Igrave", "Iacute", "Icirc", "Iuml",
 "ETH", "Ntilde", "Ograve", "Oacute", "Ocirc", "Otilde", "Ouml", "Oslash",
 "Ugrave", "Uacute", "Ucirc", "Uuml", "Yacute", "THORN", "szlig", "agrave",
 "aacute", "acirc", "atilde", "auml", "aring", "aelig", "ccedil", "egrave",
 "eacute", "ecirc", "euml", "igrave", "iacute", "icirc", "iuml", "eth",
 "ntilde", "ograve", "oacute", "ocirc", "otilde", "ouml", "oslash", "ugrave",
 "uacute", "ucirc", "uuml", "yacute", "thorn", "yuml"
 };

 for(unsigned int i = 0; i < ARRAYSIZE(tabSymbole); i++)
 {
  webText = StringReplace(webText, "&" + tabSymbole[i] + ";", tabLitery[i + 1],
                                            TReplaceFlags() << rfReplaceAll);
 }


 return webText;
}


Co do UTF8 to w C++Builder 2010 są na to gotowe funkcje, ale u Ciebie może zadziała coś takiego:

KOD cpp:     UKRYJ  
String __fastcall UnicodeToUtf8(String webText)
{
 String tabLitery = L"ĄąĆćĘꣳŃńŚśŻżŹź";

 String tabSymbole[] = {L"Ä„", L"Ä…", L"Ć", L"ć", L"Ę", L"Ä™", L"Ł",
 L"Ĺ‚", L"Ń", L"Ĺ„", L"Ĺš", L"Ĺ›", L"Ĺ»", L"ĹĽ", L"Ĺą", L"Ĺş"};


 for(unsigned int i = 0; i < ARRAYSIZE(tabSymbole); i++)
 {
  webText = StringReplace(webText, tabSymbole[i], tabLitery[i + 1],
                                            TReplaceFlags() << rfReplaceAll);
 }


 return webText;
}

Re: [BCB6] Problem z CPPWebBrowser

Nowy postNapisane: wtorek, 3 maja 2011, 15:05
przez areq47
Cyfrowy Baron napisał(a):
Co do UTF8 to w C++Builder 2010 są na to gotowe funkcje, ale u Ciebie może zadziała coś takiego:

KOD cpp:     UKRYJ  
String __fastcall UnicodeToUtf8(String webText)
{
 String tabLitery = L"ĄąĆćĘꣳŃńŚśŻżŹź";

 String tabSymbole[] = {L"Ä„", L"Ä…", L"Ć", L"ć", L"Ę", L"Ä™", L"Ł",
 L"Ĺ‚", L"Ń", L"Ĺ„", L"Ĺš", L"Ĺ›", L"Ĺ»", L"ĹĽ", L"Ĺą", L"Ĺş"};


 for(unsigned int i = 0; i < ARRAYSIZE(tabSymbole); i++)
 {
  webText = StringReplace(webText, tabSymbole[i], tabLitery[i + 1],
                                            TReplaceFlags() << rfReplaceAll);
 }


 return webText;
}


Użyłem tej funkcji i niektóre znaki się zamieniają, ale jest problem z literą "ą" i "ś". O co tu może chodzić? Krzaczki oznaczające te litery zostają