непонятки между libtorrent и msvc2010

Картежник
Дата: 01.03.2015 20:13:04
выходит ошибка R6010 abort() has been called.
ошибку вызывает конструктор torrent_info()
add_torrent_params p;
...
p.ti = new torrent_info("C:/1.torrent",ec);
...

начал отлаживать. заметил что в torrent_info.cpp на строке с кодом
...
int ret = load_file(filename, buf, ec);
...

в переменную filename попадают другие символы. менял в настройках Набор символов (Юникод и многобайтовая кодировка) результат примерно одинаковый - левые символы(временами с "C:/1.torrent", а иногда и без них)
dll и lib либторрента собрал тоже в двух кодировках и проверил обе. что можно сделать ?
Картежник
Дата: 01.03.2015 20:22:05
код конструктора для данной ситуации
torrent_info::torrent_info(std::string const& filename, error_code& ec, int flags)
		: m_merkle_first_leaf(0)
		, m_piece_hashes(0)
		, m_creation_date(0)
		, m_info_section_size(0)
		, m_multifile(false)
		, m_private(false)
		, m_i2p(false)
	{
		std::vector<char> buf;
		int ret = load_file(filename, buf, ec);
		if (ret < 0) return;

		lazy_entry e;
		if (buf.size() == 0 || lazy_bdecode(&buf[0], &buf[0] + buf.size(), e, ec) != 0)
			return;
		parse_torrent_file(e, ec, flags);

		INVARIANT_CHECK;
	}
Картежник
Дата: 01.03.2015 20:27:53
Картежник, а вот то что туда попадает

filename " Y¬C:/1.torrent" const std::basic_string<char,std::char_traits<char>,std::allocator<char> > &
MasterZiv
Дата: 02.03.2015 16:21:00
Картежник
код конструктора для данной ситуации
torrent_info::torrent_info(std::string const& filename, error_code& ec, int flags)
		: m_merkle_first_leaf(0)
		, m_piece_hashes(0)
		, m_creation_date(0)
		, m_info_section_size(0)
		, m_multifile(false)
		, m_private(false)
		, m_i2p(false)
	{
		std::vector<char> buf;
		int ret = load_file(filename, buf, ec);
		if (ret < 0) return;

		lazy_entry e;
		if (buf.size() == 0 || lazy_bdecode(&buf[0], &buf[0] + buf.size(), e, ec) != 0)
			return;
		parse_torrent_file(e, ec, flags);

		INVARIANT_CHECK;
	}


А где ты этот суперзамечательный код взял ?

P.S. Ведь сколько раз твердили миру... Конструкторы -- для инициализации, а не для каких-то действий.
Картежник
Дата: 02.03.2015 17:44:28
MasterZiv

А где ты этот суперзамечательный код взял ?

P.S. Ведь сколько раз твердили миру... Конструкторы -- для инициализации, а не для каких-то действий.


это из примера
#include <stdlib.h>
#include "libtorrent/entry.hpp"
#include "libtorrent/bencode.hpp"
#include "libtorrent/session.hpp"

int main(int argc, char* argv[])
{
	using namespace libtorrent;

	if (argc != 2)
	{
		fputs("usage: ./simple_client torrent-file\n"
			"to stop the client, press return.\n", stderr);
		return 1;
	}

	session s;
	error_code ec;
	s.listen_on(std::make_pair(6881, 6889), ec);
	if (ec)
	{
		fprintf(stderr, "failed to open listen socket: %s\n", ec.message().c_str());
		return 1;
	}
	add_torrent_params p;
	p.save_path = "./";
	p.ti = new torrent_info(argv[1], ec);
	if (ec)
	{
		fprintf(stderr, "%s\n", ec.message().c_str());
		return 1;
	}
	s.add_torrent(p, ec);
	if (ec)
	{
		fprintf(stderr, "%s\n", ec.message().c_str());
		return 1;
	}

	// wait for the user to end
	char a;
	scanf("%c\n", &a);
	return 0;
}
Картежник
Дата: 02.03.2015 17:47:14
MasterZiv

А где ты этот суперзамечательный код взял ?

P.S. Ведь сколько раз твердили миру... Конструкторы -- для инициализации, а не для каких-то действий.

а код конструктора в исходниках libtorrent через отладчик перешел на этот код
MasterZiv
Дата: 03.03.2015 01:03:50
Картежник,

ну

new torrent_info(argv[1], ec);


строка эта приходит из параметра коммандной строки, в винде это может вызывать дополнительные проблемы -- в винде она
должна быть в т.н. OEM-кодировке (т.е. в cp866 для руской винды), и тебе нужно её переводить сначала в cp1251, потом в
уже ту кодировку, в которой работает библиотека и в которой она вызывает функции WIN API.

забей туда для примера в виде литерала какую-то фиксированную строку для имени файла и попробуй так.
Картежник
Дата: 03.03.2015 07:30:48
MasterZiv
Картежник,

ну

new torrent_info(argv[1], ec);


строка эта приходит из параметра коммандной строки, в винде это может вызывать дополнительные проблемы -- в винде она
должна быть в т.н. OEM-кодировке (т.е. в cp866 для руской винды), и тебе нужно её переводить сначала в cp1251, потом в
уже ту кодировку, в которой работает библиотека и в которой она вызывает функции WIN API.

забей туда для примера в виде литерала какую-то фиксированную строку для имени файла и попробуй так.


да я по разному пробовал, какие то левые символы еще попадают. значит надо искать другой вариант инициализации и загрузки имени файла.
MasterZiv
Дата: 03.03.2015 08:18:51
Картежник,

тогда приведи полный код примера, как запускаешь, ошибки, проблемы и прочие подробности
Картежник
Дата: 03.03.2015 13:43:15
MasterZiv
Картежник,

тогда приведи полный код примера, как запускаешь, ошибки, проблемы и прочие подробности


// fortorrent.cpp: определяет точку входа для консольного приложения.


#include "stdafx.h"
#include <stdlib.h>

#include <iostream>
#include <fstream>
#include <iterator>
#include <exception>

#include <boost/format.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>


#include <libtorrent/session.hpp>

#include <boost/asio/impl/src.hpp>
#include "libtorrent/entry.hpp"
#include "libtorrent/bencode.hpp"
#include <string.h>


#pragma comment(lib,"libtorrent.lib")

using namespace libtorrent;

int _tmain(int argc,char* argv[])
//int _tmain(int argc, _TCHAR argv[])
{ 
	//boost::asio::io_service io_service;
	printf("Hello\n");
	/*if (argc != 2) //отключил, потому что название файла задаю в коде
  {
    fputs("usage: ./simple_client torrent-file\n"
      "to stop the client, press return.\n", stderr);
   // return 1;
  }*/
	session s;
	error_code ec;
	fprintf(stderr,"begin...\n");
	s.listen_on(std::make_pair(6881,6889),ec);
	if(ec){
		fprintf(stderr,"failed to open listen socket: %s\n",ec.message().c_str());
		//return 1;
	}
	else{
	//	fprintf(stderr,"listen...%s\n",argv[1]);
	}
	add_torrent_params p;
	p.save_path="./";
	//char *tor="C:\\1.torrent";
	std::string const tor="c:\\1.torrent";
		fprintf(stderr,"torrent...%s\n",tor.c_str());
		p.ti = new torrent_info("c:\\1.torrent",ec);
	//	p.ti = new torrent_info(tor.c_str(),ec);
		
	//p.ti=new torrent_info(argv[1],ec);
	if(ec){
		fprintf(stderr,"%s\n",ec.message().c_str());
		//return 1;
	}
	else{
	//	fprintf(stderr,"new torrent %s\n",argv[1]);
	}
	s.add_torrent(p,ec);
	if(ec){
		fprintf(stderr,"%s\n",ec.message().c_str());
		//return 1;
	}
	else{
		fprintf(stderr,"torrent added\n");
	}
	char a;
	scanf("%c\n",a);
	system("PAUSE");
	return 0;
}

просто запускаю не передавая никаких параметров, результат на картинке