Przechwytywanie nazwy strony z przeglądarki

0

Witam. Wiem jak to zrobić w BCB, żeby zrzucić do pliku:


char *adres;	//zmienna globalna

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   FILE *plik;
   plik = fopen("C:\\plik.txt", "w+");

   DdeClientConv1->SetLink("iexplore", "WWW_GetWindowInfo");
   adres = DdeClientConv1->RequestData("0xFFFFFFFF, sURL, sTitle");
   fputs(adres, plik);

   fclose(plik);
}

W tym wypadku dane są pobierane z przeglądarki Internet Explorer.
Jakby wyglądał kod w czystym C++?

0

nie jestem w stanie podac Ci dokladnego odpowiednika, bo nie "widze" jakby tu opakowac dde-owego callbacka tak zeby jakotako pasowal do tego przykladu.. troche luznych snippetow:

na samym poczatku rozpoczynasz prace z DDE:

    DWORD id; //identyfikator DDE Twojego programu
    DdeInitialize (&id, &DDE_ProcessMessage, APPCMD_CLIENTONLY, 0);

potrzebuje on callbacka obslugujacego wiadomosci DDE, cos ala wndProc tylko dla DDE:

HDDEDATA CALLBACK DDE_ProcessMessage(      
    UINT uType, UINT uFmt, HCONV hconv,
    HDDEDATA hsz1, HDDEDATA hsz2, HDDEDATA hdata,
    HDDEDATA dwData1, HDDEDATA dwData2
)
{
    // sek w tym ze nie pamietam ciala tej funkcji
}

przygotowujesz sobie identyfikatory:
    HANDLE hszServerName = DdeCreateStringHandle (id, "iexplore", 0);
    HANDLE hszTopicName = DdeCreateStringHandle (id, "WWW_GetWindowInfo", 0);
    HCONV hConversation = DdeConnect(id, hszServerName, hszTopicName, NULL);


potem mozesz wywolac operacje przy ich pomocy, cos w okolicach:
    unsigned char buffer[1024];
    DWORD dwResult;
    HDDEDATA hdd = DdeClientTransaction (
            (unsigned char*)"0xFFFFFFFF, sURL, sTitle",  25,
            hConversation, NULL, CF_TEXT,
            XTYP_???EXECUTE???, TIMEOUT_??ASYNC??, &dwResult);

w wyniku tej operacji dostajesz uchwyt "hdd" pod ktorym siedzi wynik operacji, mozna sie do niego dostac tak:
    DWORD size;
    BYTE* pointer;
    pointer = DdeAccessData(hdd, &size);  //pointer - na pierwszy bajt danych, size - ilosc bajtow

i teraz np.
    fputs( (char*)pointer, plik);

jak skonczysz uzywac tych danych, musisz wywolac:
    
    DdeUnaccessData(hdd);

ale nie powoduje to utraty teog wyniku i danych! caly czas jeszcze mozesz go Accessowac ponownie. jak juz skonczysz calkiem korzystac z tego wyniku, musisz zwolnic jego uchwyt, zeby bufory DDE nie rosly w nieskonczonosc

    DdeFreeDataHandle(hdd);

a jak skonczysz gadac z dana aplikacja-tematem, to zrywasz i zwalniasz kanal komunikacyjny:

    DdeDisconnect (hConversation);

a jak konczysz w ogole prace z DDE, to zwalniasz pierwotne zasoby:
    DdeFreeStringHandle (id, hszServerName);
    DdeFreeStringHandle (id, hszTopicName);
    DdeUninitialize (id);

hm.. to tyle co moge teraz powiedziec..

0
quetzalcoatl napisał(a)

HDDEDATA CALLBACK DDE_ProcessMessage(
UINT uType, UINT uFmt, HCONV hconv,
HDDEDATA hsz1, HDDEDATA hsz2, HDDEDATA hdata,
HDDEDATA dwData1, HDDEDATA dwData2
)
{
// sek w tym ze nie pamietam ciala tej funkcji
}

Hmm... dzięki za odpowiedź, ale do zrealizowania tego kodu potrzebowałbym ciało powyższej funkcji. Byłbym wdzięczny, jeśli ktoś umieściłby to na forum.
Pozdrawiam.

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