Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Мусор в названиях экспортируемых функций dll


Автор: Yak 5.11.2005, 13:22
Короче тема такая - есть готовый код диспечера задач на VB 6.0 . Но он использует библиотеку, написанную на VC++. Так вот, с этой библиотекой и проблемы - при компиляции все вроде проходит без проблем, но когда лезешь в таблицу экспорта нех-редактором - там функция GetAllProcesses выглядит примерно так - ?GetAllProcesses@2vfgjh@@LAGRE_INTEGER@GYKFDW@@FJ
Естесственно, VB ругается что функция не найдена. Перерыл все - а как сделать функции нормальный вид так и не нашел. Конеш можно опять тем же нех-редактором поправить, мусор нулями забить, но эт жутко неудобно, хотя и работает.

Кто нить знает, от чего такая хрень происходит? и как от этого избавиться?

P.S. Просьба сильно не ругатся, если такая темка где уже и была...

Автор: DeadSoul 5.11.2005, 13:39
Родной, у тебя с памятью все в порядке?
http://forum.vingrad.ru/index.php?showtopic=69722

Автор: srd 5.11.2005, 13:39
Тебе нужно запретить декорирование имён экспортируемых функций. Самый простой способ - добавить в проект DEF файл, написать в нём список экспортируемых функций и пересобрать библиотеку.
Код

LIBRARY CoolLibraryName
EXPORTS
    SomeFunction
    OtherFunction
    ...

Тогда имена не будут искажаться. Если вместо DEF-файла используешь __declspec(dllexport), то все объявления экспортируемых функций помести в блок extern "C" {}. Тогда функции будут декорироваться по правилам Си, а не Си++, т.е. вместо "мусора" будет один символ подчёрка.
Добавлено @ 13:41
А, блин... Совсем склероз замучал smile

Автор: S.A.P. 5.11.2005, 13:50
/* Offtop
Баян smile
*/

Автор: Yak 5.11.2005, 18:32
Цитата
Родной, у тебя с памятью все в порядке?
в порядке. ))))) просто я с кпк хожу сюда, а он часто глючит. ту тему можно удалить.

Вот скачал исходник, малость его поправил, и с чем столкнулся - в структуру PSYSTEM_PROCESSES не передаются имена процессов. Точнее сюда
PCWSTR pszProcessName = pProcesses->ProcessName.Buffer;
передаются ?? и прервый символ из имени процесса. При этом все остальные параметры передаются без проблем. Кто нить знает почему?

Код

BOOL WINAPI EnumProcesses(IN LPCTSTR pszMachineName, IN PFNENUMPROC pfnEnumProc, IN LPARAM lParam)
{
    _ASSERTE(pfnEnumProc != NULL);
    pszMachineName = NULL;

    if (pszMachineName != NULL) return SetLastError(ERROR_INVALID_PARAMETER), FALSE;
    HINSTANCE hNtDll;
    hNtDll = GetModuleHandle("ntdll.dll");
    NTSTATUS (WINAPI * _ZwQuerySystemInformation)(UINT, PVOID, ULONG, PULONG);

    _ASSERTE(hNtDll != NULL);   

    *(FARPROC *)&_ZwQuerySystemInformation = GetProcAddress(hNtDll, "ZwQuerySystemInformation");
    if (_ZwQuerySystemInformation == NULL) return SetLastError(ERROR_PROC_NOT_FOUND), FALSE;
    HANDLE hHeap = GetProcessHeap();
    NTSTATUS Status;
    ULONG cbBuffer = 0x64000;
    PVOID pBuffer = NULL;

    pBuffer = HeapAlloc(hHeap, 0, cbBuffer);
    Status = _ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, pBuffer, cbBuffer, NULL);

    PSYSTEM_PROCESSES pProcesses;
    pProcesses = (PSYSTEM_PROCESSES)pBuffer;

    for (;;)    
    {  
        lParam = pProcesses->BasePriority;
        USHORT WParam = pProcesses->ProcessName.Length;
        PCWSTR pszProcessName = pProcesses->ProcessName.Buffer;
        if (pszProcessName == NULL) pszProcessName = L"Idle";
        #ifdef UNICODE 
            if (!pfnEnumProc(pProcesses->ProcessId, pszProcessName, lParam, WParam)) break;
        #else 
            CHAR szProcessName[MAX_PATH];
            WideCharToMultiByte(CP_ACP, 0, pszProcessName, -1, szProcessName, MAX_PATH, NULL, NULL);
            if (!pfnEnumProc(pProcesses->ProcessId, szProcessName, lParam, WParam)) break;
        #endif 
        if (pProcesses->NextEntryDelta == 0)            break;
        pProcesses = (PSYSTEM_PROCESSES)(((LPBYTE)pProcesses) + pProcesses->NextEntryDelta);
    }    
    HeapFree(hHeap, 0, pBuffer);
    return 1;
}


Автор: DeadSoul 5.11.2005, 19:00
Цитата(Yak @ 5.11.2005, 18:32)
Вот скачал исходник, малость его поправил, и с чем столкнулся - в структуру PSYSTEM_PROCESSES не передаются имена процессов. Точнее сюда
PCWSTR pszProcessName = pProcesses->ProcessName.Buffer;

smile Правила читай. Один вопрос - одна тема.

Автор: _hunter 7.11.2005, 12:02
Yak, во-первых: как ты смотриш.
во-вторых: кто тебя ТАК строки учил копировать?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)