Страница 3 из 5

Добавлено: Чт, 12 ноября 2015, 14:33:00
dyvniy

Добавлено: Пн, 23 ноября 2015, 19:10:33
dyvniy
Из dll можно извлечь список функций

Код: Выделить всё

dumpbin.exe /EXPORTS /rawdata:none "путь-к-dll" >> "файл-куда-записать-инфу"

Но кроме имени функции есть список параметров в хитрой закодированной форме, которую я попытался распарсить
Спойлер
/* uchar*, uchar*, uchar, uchar*, uchar*, uchar, uint&, uchar&, uint, ulong
1 0 0000F0E0 ?Compress@@YAH PEA PEB E PEA PEA E IA EA I K @Z
2 1 0000F140 ?Decompress @@YAHPEAPEBEPEAPEAEIAEAIK@Z

3 2 00001030 ?fnCompress0@@YAH PAD PAH 0H@Z = ?fnCompress0@@YAHPADPAH0H@Z (int __cdecl fnCompress0(char *,int *,char *,int))
4 3 00001030 ?fnCompress1@@YAH PAD PAH 0H@Z = ?fnCompress0@@YAHPADPAH0H@Z (int __cdecl fnCompress0(char *,int *,char *,int))
5 4 00001020 ?fnCompress @@YAHPADPAHPA_W_J@Z = ?fnCompress@@YAHPADPAHPA_W_J@Z (int __cdecl fnCompress(char *,int *,wchar_t *,__int64))
6 5 00001010 ?fndllForCompare@@YAH XZ = ?fndllForCompare@@YAHXZ (int __cdecl fndllForCompare(void))

Код: Выделить всё

YAH - return int, YAX - return void
PA + <литера числа> = указатель на него
D - char, E - uchar, F - short, (G - ushort,) H - int, I - uint, J - long, K = ulong, _J - int64, _K - uint64, ( L - int128,) _N - bool
M - float, N - double, O - long double, (X - void,) _W - wchar_t

*/

Добавлено: Вт, 24 ноября 2015, 18:40:18
dyvniy
Вызов консольного приложения и перехват его вывода, с фильрацией
Спойлер
#include "stdafx.h"
#include <windows.h>

#include <iostream>
#include <string>
using namespace std;

int main00()
{
char b[128];
FILE *p;

p = _popen( "cons.exe 10", "rt" );

string w[] = {
{ "CPRenderNodeMesh::Allocate(), pool empty, using new instead.\n" },
};
string s;
while (fgets( b, 128, p ))
{
//if (s != w[0])
s += b;
}
cout << s;

getchar();
return 0;
}

Добавлено: Вс, 13 декабря 2015, 11:45:05
dyvniy
std::shared_mutex из С++14
http://stackoverflow.com/questions/19915152/c11-m ... ead-and-one-write-thread-mutex
позволяет заблокировать объект для записи в одном потоке либо чтения из нескольких
очень полезная штука, уже давно есть в boost, в vs2015 тоже есть.

Список фич, реализованных в студии.
http://habrahabr.ru/company/microsoft/blog/262805/

Добавлено: Ср, 16 декабря 2015, 18:39:27
dyvniy
Реализация одноразового барьера на С++11
http://habrahabr.ru/post/246947/

Код: Выделить всё

#include <iostream>
#include <thread>
#include <atomic>
#include <condition_variable>
#include <mutex>

class barrier {
 const 
unsigned int threadCount;
 
std::atomic<unsigned int>threadsWaiting;
  
bool isNotWaiting;
 
std::condition_variable waitVariable;
 
std::mutex mutex;
public:
 
barrier(unsigned int n) : threadCount(n) {
  
threadsWaiting 0;
  
isNotWaiting false;
}
barrier(const barrier &) = delete;
 
void wait() {
  if (
threadsWaiting.fetch_add(1) >= threadCount 1) {
   
isNotWaiting true;
   
waitVariable.notify_all();
   
threadsWaiting.store(0);
 }
 else {
  
std::unique_lock<std::mutexlock(mutex);
  
waitVariable.wait(lock,[&]{ return isNotWaiting;});
 }
}
};


barrier *myBarrier;

class 
Thread {
private:
    
std::threadcppthread;
    static 
void threadFunction(Threadarg) {
        
arg->run();
    }
public:
    
Thread() {}
    
Thread(const Thread&) = delete;
    
virtual ~Thread() {delete cppthread;}
    
virtual void run() = 0;
    
void start() {
        
cppthread = new std::thread(Thread::threadFunctionthis);
    }
    
void wait() {
        
cppthread->join();
    }
};

class 
BarrierDemo: public Thread {
  
int id;
public:
 
BarrierDemo(int i) {
     
id i;
 }
 
void run() {
     
std::cout << "Thread " << id << "runs before barrier" << std::endl;
     
myBarrier->wait();
     
std::cout << "Thread " << id << "runs after barrier" << std::endl;
 }
};

int main() {
    
// your code goes here
    
int threads;
    
std::cin >> threads;
    
myBarrier = new barrier(threads);

   
BarrierDemobardemos static_cast<BarrierDemo*>(::operator new(sizeof(BarrierDemo)*threads));
    
    for (
int i 0threadsi++) {
        new (&
bardemos[i])BarrierDemo(i);
        
bardemos[i].start();
    }
    for (
int i 0threadsi++) {
        
bardemos[i].wait();
    }
   
  
   ::
operator delete(bardemos);
    
delete myBarrier;
    return 
0;

Добавлено: Пн, 25 января 2016, 11:44:18
dyvniy
weak_ptr
http://ru.cppreference.com/w/cpp/memory/weak_ptr
используется для исключения циклических ссылок.
Спойлер
#include <iostream>
#include <memory>

std::weak_ptr<int> gw;

void f()
{
if (auto spt = gw.lock()) { // необходимо скопировать в shared_ptr перед использованием
std::cout << *spt << "\n";
} else {
std::cout << "gw is expired\n";
}
}

int main()
{
{
auto sp = std::make_shared<int>(42);
gw = sp;

f();
}

f();
}