[C++] Sprawdzanie stanu wysunięcia tacki napędu


(Jaksza5) #1

Witam, postanowiłem napisać mały programik do "trollingu"(tylko w ramach ćwiczeń), jednak napotkałem na problem, ponieważ nie wiem jak sprawdzić czy tacka od napędu jest wysunięty, czy użytkownik wsunął ją. A ogólnie to coś ma działać tak:

  • Po włączeniu program wysuwa po raz pierwszy wysuwa tackę.

  • Użytkownik zauważając, że się wysunęła, wsuwa ją z powrotem. (może być to od razu, ale też po 5 minutach/8 godzinach/po roku/za 7 wieków... Czyli w każdym momencie.

  • Program "wyłapuje", że użytkownik wsunął tą tackę i znów ją wysuwa. itd.

Na razie napisałem coś takiego, korzystając z dobrodziejstw internetu:

#include 

#include 

void zapetlacz();


void sprawdzacz(){

    bool check;

    check = mciSendString("set CDAudio door closed", "CD drive close", 0, 0);

    if (check!=0) mciSendString("set CDAudio door open", "CD drive open", 0, 0);

    else{zapetlacz();}

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)


{

  sprawdzacz();

  return 0;


}


void zapetlacz(){

sprawdzacz();

}

Ale coś nie pykło:

C:\Users\tomek\Desktop\program_do_testowania\tacka\main.cpp||In function 'void sprawdzacz()':|

C:\Users\tomek\Desktop\program_do_testowania\tacka\main.cpp|7|warning: deprecated conversion from string constant to 'CHAR*'|

C:\Users\tomek\Desktop\program_do_testowania\tacka\main.cpp|8|warning: deprecated conversion from string constant to 'CHAR*'|

||=== Build finished: 0 errors, 2 warnings ===|

Przewertowałem http://msdn.microsoft.com/en-us/library/ms712587.aspx, ale nic ciekawego nie znalazłem. Czy mogę to sprawdzić? Z góry dziękuję za pomoc.


(Copycona) #2
mciSendString("set CDAudio door closed", "CD drive close", 0, 0);[/code]

Składnia tej funkcji: http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Spojrzałem tylko pod ten link wyżej i już coś się nie zgadza.

Drugi i trzeci parametr:

Powinieneś podać pointer do bufora, gdzie zostanie zapisana informacja zwrotna, a nie jak w tym kodzie c-string którego oczekujesz i chcesz sprawdzić. Dopiero później możesz zweryfikować co zostało wpisane do bufora przez funkcję, i określić stan urządzenia. Kolejny parametr to wielkość bufora, do którego pointer podałeś w poprzednim parametrze.


(Jaksza5) #3

Czy można byłoby troszkę jaśniej? Aż tak pojęty w programowaniu nie jestem.

Bo do ciągłego wysuwania i wsuwania takie coś użyłem:

mciSendString("Set CDAudio Door Open wait", 0, 0, 0);

mciSendString("Set CDAudio Door Closed wait", 0, 0, 0);

i działało. Już też rozważałem naukę assemblera i pokombinowania w nim.


(Rolek0) #4

177 wystarczająco jasno opisał do czego służy drugi argument mciSendString.

TCHAR ret[256];

MCIERROR err = mciSendString(TEXT("set cdaudio door open"), ret, 256, 0);

Jednak u mnie "set cdaudio door open/closed" nie zwraca żadnego napisu i w dokumentacji też nie znalazłem, żeby miało coś zwracać.

Polecam http://gynvael.coldwind.pl/?id=238 oraz http://xion.org.pl/productions/texts/coding/megatutorial/ :slight_smile:

W tym przypadku akurat nic by ci to nie dało bo współczwesne procesory mają tzw. tryb chroniony, programy użytkownika nie mają bezpośredniego dostępu do sprzętu, mogą się komunikować jedynie z systemem operacyjnym.


(Jaksza5) #5

cholera, jak to kurcze zrobić...

Bo robienie takiej pętli mija się trochę z celem.

#include 

#include 


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)


{

  for(;;){

  mciSendString("Set CDAudio Door Open wait", 0, 0, 0);

  }

  return 0;


}