• Компиллятор теряет реализацию метода в библиотеке

    @vScherba
    Тогда класс MercatorMap внесет лишнюю зависимость в заголовочник. Это может оказаться нежелательно.
  • Компиллятор теряет реализацию метода в библиотеке

    @vScherba
    Т.к у Вас в коде соглашение о вызовах явно не указано, то оно берется из настроек проекта, посмотрите настройки проектов (lib и exe) для Visual Studio это C/C++ -> Advanced -> Calling Convention, они должны совпадать. Либо каждому методу при объявлении и определении нужно явно его указывать.
  • Заливка файла на сайт из DLL

    @vScherba
    Понятно, значит не было прав на чтение файла. Все равно, в этом примере полный путь дефайнить неуместно, потому что макроопределение еще тут используется:

    "Content-Disposition: form-data; name=\"file\"; filename=\""FILE_NAME"\"\r\n"
    

    Должно быть имя файла без пути. Хорошо, что сервер это проглотил.
  • Заливка файла на сайт из DLL

    @vScherba
    Покажите, как указали #define
  • Заливка файла на сайт из DLL

    @vScherba
    Вот рабочий код на голом WinInet API для основы. Без форматирования, проверок, обработки ошибок и прочих плюшек (не забудьте линкеру скормить WinInet.lib):

    Скрытый текст
    #include <tchar.h>
    #include <Windows.h>
    #include <WinInet.h>
    
    #include <fstream>
    #include <sstream>
    #include <vector>
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        HINTERNET hInet = ::InternetOpen(
              _T("My User Agent")
            , INTERNET_OPEN_TYPE_PRECONFIG // get proxy from IE settings
            , NULL
            , NULL
            , 0);
    
        HINTERNET hConn = ::InternetConnect(
              hInet
            , _T("gtasnp.com")
            , INTERNET_DEFAULT_HTTP_PORT
            , NULL
            , NULL
            , INTERNET_SERVICE_HTTP
            , 0
            , NULL
            );
    
        LPCTSTR accept[] = {_T("text/html"), NULL};
        HINTERNET hReq = ::HttpOpenRequest(
              hConn
            , _T("POST")
            , _T("/upload")
            , NULL
            , _T("http://gtasnp.com/") // referrer
            , accept
            ,   INTERNET_FLAG_NO_CACHE_WRITE |
                INTERNET_FLAG_NO_COOKIES |
                INTERNET_FLAG_NO_UI |
                INTERNET_FLAG_PRAGMA_NOCACHE |
                INTERNET_FLAG_RELOAD
            , NULL
            );
    
        #define FILE_NAME "GTASAsf1.b"
        #define BOUNDARY "MySuperPuperUniqueBoundary"
    
        std::ostringstream contentStrm(std::ios_base::out | std::ios_base::binary);
        contentStrm
            << "--"BOUNDARY"\r\n"
            << "Content-Disposition: form-data; name=\"file\"; filename=\""FILE_NAME"\"\r\n"
            << "Content-Type: application/octet-stream\r\n\r\n";
    
        contentStrm << std::ifstream(FILE_NAME, std::ios_base::in | std::ios_base::binary).rdbuf();
    
        contentStrm << "\r\n--"BOUNDARY"--\r\n";
        std::string content = contentStrm.str();
        contentStrm.str(std::string()); // clear memory inside ostringstream
    
        const TCHAR headers[] = _T("Content-Type:multipart/form-data; boundary=")_T(BOUNDARY);
        BOOL res = ::HttpSendRequest(
              hReq
            , headers
            , ARRAYSIZE(headers)
            , const_cast<char*>(content.c_str())
            , content.size()
            );
    
        std::vector<char> buf;
        std::ofstream responseFile("response.html");
    
        DWORD bytesAvail = 0;
        while(true)
        {
            res = ::InternetQueryDataAvailable(
                  hReq
                , &bytesAvail
                , 0
                , 0
                );
            if (!res || 0 == bytesAvail)
            {
                break;
            }
    
            buf.resize(bytesAvail);
    
            res = ::InternetReadFile(
                  hReq
                , &buf[0]
                , buf.size()
                , &bytesAvail
                );
    
            buf.resize(bytesAvail);
    
            std::copy(buf.begin(), buf.end(), std::ostream_iterator<char>(responseFile));
        }
    
        responseFile.close();
            
    
        ::InternetCloseHandle(hReq);
        ::InternetCloseHandle(hConn);
        ::InternetCloseHandle(hInet);
    
        return 0;
    }
    
  • Заливка файла на сайт из DLL

    @vScherba
    Чтобы не париться самому с multipart/form-data, лучше все-таки через libcurl сделать.
    Можно также внешнюю команду из dll дернуть, как тут, например, stackoverflow.com/questions/12667797/using-curl-to-upload-post-data-with-files
  • Заливка файла на сайт из DLL

    @vScherba
    А Вы правильно запостили форму? Использовали формат multipart/form-data?
    Вот, например, что постит Chrome в теле запроса:

    ------WebKitFormBoundary0oDi49mKf8lH8N7x
    Content-Disposition: form-data; name=«max_file_size»

    2097152
    ------WebKitFormBoundary0oDi49mKf8lH8N7x
    Content-Disposition: form-data; name=«file»; filename=«test_file.txt»
    Content-Type: application/octet-stream

    ------WebKitFormBoundary0oDi49mKf8lH8N7x--
    тут содержимое файла должно быть
  • Односторонняя передача информации между процессами?

    @vScherba
    В таком случае, создайте скрытое окно и в его процедуре обрабатывайте прогресс, а сообщение из другого процесса шлите ему стандартным PostMessage(hwnd_скрытого_окна, WM_USER, N1, N2). Маршалинг Вам не нужен при передаче long значения в lParam или wParam.
  • Утечка памяти при использовании std::thread в visual studio 2012?

    @vScherba
    Насчет того, как бороться: в текущей версии компилятора — никак (исправлено в следующей), в цикле утечка не должна нарастать, проверьте это на практике. Должны утекать те же 44 байта. Но это не совсем утечка:
    The leak is the «static _Mtx_t at_thread_exit_mutex» declared in «crt\src\thr\xnotify.c», which is allocated once for the first created std::thread but never freed. So it's not a leak per say, more of a «skipped cleaning up after me»-issue.
    © Andreas Magnusson
  • Дождаться события с другого потока, не прерывая обработку сообщений?

    @vScherba
    Проще, конечно, из вспомогательного потока послать через PostMessage (или SendMessage — зависит от задачи) сообщение в главный поток.
  • Использование decltype или…?

    @vScherba
    Забыл поставить typename перед std::iterator_traits<RandomAccessIterator>::value_type
  • Можно ли обойтись без виртуального наследования?

    @vScherba
    > Зачем убирать virtual, если у них действительно общая база?

    Виртуальное наследование имеет накладные расходы в рантайм. Но к нему приходится прибегать, когда дубликаты членов-данных в нескольких одинаковых базах недопустимы. IReadableDataset не имеет состояния, поэтому виртуальное наследование здесь бесполезно. Для примера, добрая часть COM-объектов множественно наследуют интерфейсы, которые в свою очередь унаследованы от IUnknown (т.е. IUnknown база имеен несколько копий), и все прекрасно работает без virtual.
  • Можно ли обойтись без виртуального наследования?

    @vScherba
    > Ну, если я уберу virtual, то при использовании CDatasetImpl меня замучают disambiguition method'ами.
    Приведите, пожалуйста, пример кода, когда компилятор начнет ругаться о disambiguition method. Возможно, я что-то упустил, вот этот код компилируется без ошибок: CDatasetImpl().SayReadableDataset();
  • WideCharToMultiByte msvc 2012 bug?

    @vScherba
    По поводу быстрого способа, который не тянет за собой либы COM: воспользуйтесь converted = CW2A(wstr); (atlbase.h).
  • WideCharToMultiByte msvc 2012 bug?

    @vScherba
    Расшифруйте, пожалуйста, что значит — не работает? Какой код возврата обоих вызовов WideCharToMultiByte и какой GetLastError()? У меня 2012 студии нет в наличии, проверить код нет возможности.
    Вообще, WideCharToMultiByte к студии отношения имеет мало, реализуется виндой в Kernel32.dll. Возможно, ошибка в чем-то другом.
  • Вопрос специалистам по GCC и темплейтам C++

    @vScherba
    Да, действительно, в файле os-binder-function.h
    struct OS_BIND_FUNC_CLASS_NAME
    {
    ...
        template <class R>
        static int run(ObjectScript::OS * os, int params, int, int, void * user_param)
    ...
        template <>
        static int run<void>(ObjectScript::OS * os, int params, int, int, void * user_param)
    ...
    }
    
  • Как узнать, хватит ли места на диске при копировании файла?

    @vScherba
    Я не пользовался Qt, но мне кажется, что там должен быть готовый метод для копирования файла с резервированием места на диске, возможно реализованный на базе API для каждой ОС. Полагаю, никто не скопирует файл быстрее самой ОС.