Zjadanie litery - błąd w kodzie (WinAPI)

Odpowiedz Nowy wątek
2011-08-04 11:56
0

Witam! Pisząc program, natknąłem się na błąd. Zjada mi pierwszą literkę wiadomości. Szukałem co może być nie tak i lipa. Prosiłbym o przejrzenie kodu i wskazanie co może być nie tak:

#include <iostream>
#include <windows.h>
 
using namespace std;
 
HWND WindowHandle;
typedef int (WINAPI *SENDPACKET)(DWORD, char*, BOOL, BOOL);
SENDPACKET sendPacket;
HINSTANCE hLib;
 
void SendPacket(char * cPacket)
{
    DWORD PID;
    HWND hwnd = FindWindow("Okienko", NULL);
    GetWindowThreadProcessId( hwnd, &PID );
    sendPacket( PID, cPacket, TRUE, FALSE );
}
 
void SendMessage(char *text) // wysylanie wiadomosci
{
    char cPacket[strlen(text) + 6];
    cPacket[0] = (BYTE)strlen(text)+4;
    cPacket[1] = 0x00;
    cPacket[2] = 0x96;
    cPacket[3] = 0x01;
    cPacket[4] = (BYTE)strlen(text);
    cPacket[5] = 0x00;
 
    for (int i = 0; i < strlen(text); i++)
    {
        cPacket[i + 6] = (BYTE)text[i];
    }
 
    SendPacket(cPacket);
}
 
int main()
{
    hLib = LoadLibrary("packet.dll");
    DWORD PID;
    HWND hwndt = FindWindow("Okienko",NULL);
    GetWindowThreadProcessId( hwndt, &PID );
    sendPacket = (SENDPACKET)GetProcAddress(hLib, "SendPacket");
    WindowHandle = FindWindow("Okienko", NULL);
    if (WindowHandle) cout << "Znalazlem klienta" << endl << endl;
    else
    {
        cout << "Blad! Nie znalazlem klienta, zamykanie..." << endl;
        return 0;
    }
    //---------------------------------------------------------------
    char msg[256];
    int time;
    cout << "Wprowadz wiadomosc:" << endl;
    cin.ignore();
    cin.getline(msg, 256); //wczytuje wiadomosc
    cout << "Odstep czasowy:" << endl;
    cin >> time;
    while (true)
    {
        SendMessage(msg);
        _sleep(time);
    }
    return 0;
}

Jeżeli kod w porządku to w takim razie coś jest z biblioteką packet.dll.


<error>There was an error during loading user signature. Please try to reboot the Universe and check again.</error>

Pozostało 580 znaków

2011-08-04 12:21
Zjarek

Przyzwyczaiłeś się, żeby przed getline'm dawać cin.ignore(). Ma to swoje powody, bo istream::operator>> nie pobiera białych znaków po wczytywanej zmiennej. W tym przypadku na stdin nie zostają ci żadne znaki białej linii (jak przy wcześniejszym stosowaniu cin>>), więc jedyne co robi ta funkcja to ignoruje pierwszy znak wiadomości.

Pozostało 580 znaków

2011-08-04 12:23
0

Czyli rozwiązaniem jest usunięcie cin.ignore();?

Sprawdziłem, działa, dzięki.


<error>There was an error during loading user signature. Please try to reboot the Universe and check again.</error>
edytowany 1x, ostatnio: xeo545x39, 2011-08-04 12:24

Pozostało 580 znaków

2011-08-04 21:00
0
char cPacket[strlen(text) + 6];

to w ogóle przechodzi przez kompilator?

A dlaczego nie? - xeo545x39 2011-08-05 11:07
tablica statyczna, bez podania stałej wielkości - satirev 2011-08-05 11:12
Piszę w C::B i chula. - xeo545x39 2011-08-05 11:14
Ale już zdobyłem odpowiednie API pod C#, więc ten kod idzie do śmieci, razem z wątkiem :) - xeo545x39 2011-08-05 11:15
są kompilatory, które na to pozwalają(gcc, może jeszcze jakiś) i są takie, które nie(MSVC++) - nie polecałbym używania takiej konstrukcji. - byku_guzio 2011-08-05 14:54

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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