Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. newbie553

    newbie553 New Member

    Публикаций:
    0
    Регистрация:
    1 май 2009
    Сообщения:
    20
    странно. пример отсюда. с твоим вариантом в цикле тоже пустые. все равно спасибо
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Код (Text):
    1. #include <windows.h>
    2. #include <iostream>
    3.  
    4. void main()
    5. {
    6.     HWND hwnd;
    7.     wchar_t p[100];
    8.     char p1[100];
    9.     hwnd = GetDesktopWindow();
    10.     hwnd = GetWindow(hwnd, GW_CHILD);
    11.     while (hwnd !=0)
    12.     {
    13.      hwnd = GetWindow(hwnd, GW_HWNDNEXT);
    14.      GetWindowText(hwnd,p,100);
    15.      CharToOem(p, p1);
    16.      if (wcslen(p) >0)
    17.     std::cout << p1 << std::endl;
    18.     }
    19. }
     
  3. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Натолкнулся ещё на "интересную" проблему.
    Если записать так:
    DWORD IsParentPID()
    {
    PROCESSENTRY32 ProcEntry;

    код....
    }
    И при этом объявить свою точку входа в программу, при запуске EXE винда плачет, что нет MSVCR90.dll
    Однако если записать так:
    static PROCESSENTRY32 ProcEntry;
    (делаю статическую локальную переменную), то ваше названная дрянь не нужна.
    Тоже происходит с выделением памяти под TCHAR.
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    MirrorBlack
    Хороший пример для гадальщиков на кофейной гуще. Луна в зените была?
     
  5. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Кофейной гущи нет...
    DWORD IsParentPID()
    {
    PROCESSENTRY32 ProcEntry;

    HANDLE pSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (!pSnap)
    {
    PrintError();
    return NULL;
    }
    ProcEntry.dwSize = sizeof PROCESSENTRY32;
    DWORD MainPID = GetCurrentProcessId();
    bool bIsOk = Process32First(pSnap, &ProcEntry);
    while (bIsOk)
    {
    if (MainPID == ProcEntry.th32ProcessID)
    break;
    bIsOk = Process32Next(pSnap, &ProcEntry);
    }
    CloseHandle(pSnap);
    if (!bIsOk)
    return NULL;
    else
    return ProcEntry.th32ParentProcessID;
    }
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
     
  7. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Держи
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Хм, аттачи опять сломались? Бугога
     
  9. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    censored
    Забыл сказать что студийный манифест я похерил.
     
  10. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    MirrorBlack
    >Забыл сказать что студийный манифест я похерил.
    Вот поэтому и
    >при запуске EXE винда плачет, что нет MSVCR90.dll
     
  11. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    TSS
    Вы хотите сказать что MSVCR90.dll отвечает за выделение памяти в стеке???
    Проблема появляется если структура в стеке, а когда в сементе .data или .data? всё нормально.
     
  12. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    MirrorBlack
    Возможно toolhelp api завязано на рантайме, который ты отключил переопределив точку входа.
     
  13. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    TSS
    Видно не я один ищу луну в орионе :)
    Никак не могу сопоставить RTL и ToolHelp...
     
  14. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    :lol:
    Приаттач проект сюда, так гадать можно долго просто.
     
  15. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    MirrorBlack
    [опять гадаю]
    Сопоставить можно так - проект собран с дебаг конфигурацией(в ней в твою ф-цию компилятор насовал различных проверок, в том числе проверку стека), внутри IsParentPID() при выделении структуры на стеке в дебажной конфигурации дергаются ф-ции из отключенного рантайма. При static объявлении операций со стеком нет, соот-но рантайм не зовется, соот-но мессаги о длл не появляется.
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    MirrorBlack
    Конечно, а как же _chkstk в дебаг билдах?
    Собираем релиз с /NODEFAULTLIB, переопределенной точкой входа и без юзания рантайма кроме как из нтдлл
     
  17. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    TSS
    Собрано как раз Release, опять не угадал (с Debug всё тоже самое).
    Для проверки вполне хватит того куска что я выложил + своя точка входа + убить студийный манифест.
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    PS. Показывайте импорт из своей программы (dependecy walker, скриншот хотя бы раскрытый)
    или сам бианрь давайте
     
  19. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Great
    Резонный вопрос, почему обычная локальная переменная определяется?

    Вот кусок, мне кажется его должно хватить:
    #include "stdafx.h"
    #pragma comment(linker, "/ENTRY:__main")


    DWORD IsParentPID()
    {

    static PROCESSENTRY32 ProcEntry;
    PROCESSENTRY32 ProcEntry;

    HANDLE pSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (!pSnap)
    {
    return NULL;
    }
    ProcEntry.dwSize = sizeof PROCESSENTRY32;
    DWORD MainPID = GetCurrentProcessId();
    bool bIsOk = Process32First(pSnap, &ProcEntry);
    while (bIsOk)
    {
    if (MainPID == ProcEntry.th32ProcessID)
    break;
    bIsOk = Process32Next(pSnap, &ProcEntry);
    }
    CloseHandle(pSnap);
    if (!bIsOk)
    return NULL;
    else
    return ProcEntry.th32ParentProcessID;
    }

    int APIENTRY __main()
    {
    IsParentPID();
    return 0;
    }

    stdafx.h
    #pragma once

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


    #define WIN32_LEAN_AND_MEAN
    #include <tchar.h>
    #include "targetver.h"

    #include <windows.h>
    #include <Ole2.h>
    #include <ShellAPI.h>
    #include <TlHelp32.h>
    #include <Psapi.h>
     
  20. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Глюк начинается отсюда:
    bool bIsOk = Process32First(pSnap, &ProcEntry);

    Это так, чтоб "гадалось" легче :)