Ответы пользователя по тегу C++
  • WideCharToMultiByte msvc 2012 bug?

    kostik450
    @kostik450
    У меня тоже были кракозябры вместо русских букв, решилось так:

    #include <locale.h>
    int main (int argc, char **argv)
    {
       setlocale (LC_ALL, ".1251");
    }
    
    Ответ написан
    Комментировать
  • С++ какой вид памяти использовать лучше и главное почему?

    kostik450
    @kostik450
    1) Различие в том, что в в первом случае (с массивом) — память выделяется в стеке при начале работы функции и соответственно освобождается при завершении функции автоматически.

    А если пользоваться malloc то эта память берется из кучи (heap). И, соответственно можно эту память без проблем передать вызывающей функции при выходе из нашей функции. Но вызывающая функция должна не забыть сделать free.

    2) С классами тоже так же что и 1). Срок жизни экземпляра класса во втором случае (new) может быть больше, но зато на нас лежит ответственность — нужно не забывать вызывать delete (это аналог free, только с вызовом деструктора класса).

    3) Ну а здесь по большому счету — все равно как действовать, это же наш класс (все переменные private) что захотим — то и воротим внутри, никто все равно не узнает.

    Но есть такая тонкость, если мы создаем мультипоточное приложение (multithread) то нужно пользоваться мультипоточной функцией malloc (линковать с мультипоточной либой LIBCMT.LIB вместо устаревшей LIBC.LIB, для VisualStudio это флаг /MT) — иначе будут проблемы.
    Ответ написан
    2 комментария
  • Подключение dll к проекту Visual Studio 2010 (C++)

    kostik450
    @kostik450
    Делаете так:
    lib.exe /DEF:test.def /OUT:test.lib /MACHINE:IX86

    В файле test.def нужно записать:
    LIBRARY TEST
    EXPORTS
    testfunc@32 @1

    Узнать, какие там цифры вместо @32 проще всего через ошибки линковки (число в имени функции обычно равно числу ее параметров, умноженному на 4), а что там вместо @1 можно узнать через утилиту dumpbin.exe по списку экспортируемых из DLL функций.

    Бывают DLL и без @32 — это зависит от того, как она была скомпилирована через __cdecl или через __stdcall
    (это тоже легко устанавливается экспериментально)
    Ответ написан
    Комментировать
  • Работа с USB устройством?

    kostik450
    @kostik450
    У меня была такая же ошибка, когда размер буфера был не кратен 512 байт при работе с винчестером (размер сектора).

    «Поиграйтесь» с размером буфера — там, наверное, кратно 64 байт, или что-то типа того.
    Ответ написан
    3 комментария