Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2020, 23:22   #1
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 82
По умолчанию Странные имена функций и переменных в .dll

Написал простую .dll :
Код:
// C_DLL.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"

__declspec(dllexport) int Add(int A, int B){
	return A + B;
}
__declspec(dllexport) int Acc = 11;
Казалось бы, получение адреса функции Add должно было выглядеть так:
Код:
GetProcAddress(dllHandle,"Add")
а переменной Acc так:
Код:
GetProcAddress(dllHandle,"Acc")
.
В действительности обращение получается только так:
Код:
GetProcAddress(dllHandle,"?Add@@YAHHH@Z")
GetProcAddress(dllHandle,"?Acc@@3HA")
Имена взяты из .map - файла, полученного при компиляции .dll.
Как-то некрасиво получается, и от логично выглядящих примеров MSDN отличается.
Подскажите пожалуйста, в чем тут дело?
Dmitry_B вне форума Ответить с цитированием
Старый 22.04.2020, 09:06   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Dmitry_B Посмотреть сообщение
Подскажите пожалуйста, в чем тут дело?
https://en.wikipedia.org/wiki/Name_mangling
waleri вне форума Ответить с цитированием
Старый 22.04.2020, 10:10   #3
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 82
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Спасибо за хорошую ссылку.
Тем более непонятно, почему в MSDN приводится такой пример:
Код:
// File:  RUNTIME.C
// A simple program that uses LoadLibrary and 
// GetProcAddress to access myPuts from MYPUTS.DLL. 
 
#include <stdio.h> 
#include <windows.h> 
 
typedef VOID (*MYPROC)(LPTSTR); 
 
VOID main(VOID) 
{ 
    HINSTANCE hinstLib; 
    MYPROC ProcAdd; 
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 
 
    // Get a handle to the DLL module.
 
    hinstLib = LoadLibrary("myputs"); 
 
    // If the handle is valid, try to get the function address.
 
    if (hinstLib != NULL) 
    { 
        ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts"); 
 
        // If the function address is valid, call the function.
 
        if (fRunTimeLinkSuccess = (ProcAdd != NULL)) 
            (ProcAdd) ("message via DLL function\n"); 
 
        // Free the DLL module.
 
        fFreeResult = FreeLibrary(hinstLib); 
    } 
 
    // If unable to call the DLL function, use an alternative.
 
    if (! fRunTimeLinkSuccess) 
        printf("message via alternative method\n"); 
}
И никакого декорирования имени функции myPuts. Выглядит намного изящнее.
Dmitry_B вне форума Ответить с цитированием
Старый 22.04.2020, 14:55   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Не путайте С и С++.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странные имена вложений в письме ivan.tiran Общие вопросы по Java, Java SE, Kotlin 2 07.11.2019 12:58
Имена переменных в хранимой процедуре Muramidaza БД в Delphi 0 17.03.2014 22:44
Имена функций в lib-файлах pbt Свободное общение 4 15.06.2013 00:19
Задавать имена переменных в цикле Shouldercannon Общие вопросы Delphi 3 26.07.2010 21:24
Русские имена переменных VistaSV30 Microsoft Office Access 3 03.02.2010 15:42