powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как найти функцию по ее имени?
67 сообщений из 67, показаны все 3 страниц
Как найти функцию по ее имени?
    #39715925
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня!

Продолжаю терзать embedded C++.

Возникла необходимость поиска функции по ее имени (строка символов, например "myFunc") с дальнейшем присваиванием ей параметра типа wstring и запуска.
Функция возвращает тоже wstring.

В Дельфи для этого есть процедурный тип, есть ли аналог в C++?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715926
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если функция есть в таблице экспорта, то GetProcAddress()
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715927
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли функция есть в таблице экспорта, то GetProcAddress()

Имеется ввиду работа с DLL?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715928
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пишу на С/С++ уже 18 лет и каждый раз, когда я встречаю подобный вопрос, то я не понимаю как автор дошел до такого, что он не знает, где у него какая функция и требуется поиск в run-time.

На мой взгляд, если у тебя возникают подобные проблемы это свидетельствует о плохом дизайне твоего приложения и он должен быть пересмотрен. Для всего остального, вроде скриптовых языков, есть IDispatch .

Если нужно узнать имя исполняемой кодом функции то используешь макрос __FUNCTION__
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715929
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima TЕсли функция есть в таблице экспорта, то GetProcAddress()

Имеется ввиду работа с DLL?
Обычно экспортируют в DLL, но при желании можно и в EXE.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715935
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumЯ пишу на С/С++ уже 18 лет и каждый раз, когда я встречаю подобный вопрос, то я не понимаю как автор дошел до такого, что он не знает, где у него какая функция и требуется поиск в run-time.

На мой взгляд, если у тебя возникают подобные проблемы это свидетельствует о плохом дизайне твоего приложения и он должен быть пересмотрен. Для всего остального, вроде скриптовых языков, есть IDispatch .

Если нужно узнать имя исполняемой кодом функции то используешь макрос __FUNCTION__

Программе, передается извне, имя функции и параметры, которые она должна выполнить.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715937
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

COM + IDispatch
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715939
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbПрограмме, передается извне, имя функции и параметры, которые она должна выполнить.
или выноси эти функции в DLL и используй GetProcAddress, как уже предложили
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715940
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715941
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumSergey_rbПрограмме, передается извне, имя функции и параметры, которые она должна выполнить.
или выноси эти функции в DLL и используй GetProcAddress, как уже предложили

Видимо, это самый оптимальный вариант.

В Дельфи, эти функции объявляются в разделе published и находятся по имени через MethodAddress
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715943
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum example
Это ужасно, особенно тёплые-ламповые скриншоты MSVS 6.
Не уж то за 20 лет не придумали чего-нибудь более удобного чем вся эта куча бойлерплейта, в котором легко допустить ошибку?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715947
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumSergey_rbПрограмме, передается извне, имя функции и параметры, которые она должна выполнить.
или выноси эти функции в DLL и используй GetProcAddress, как уже предложили
Не обязательно выносить в DLL, экспортировать можно в EXE, но искать и вызывать можно будет только изнутри этого EXE, но в данном случае это подходит.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715948
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZCerebrum example
Это ужасно, особенно тёплые-ламповые скриншоты MSVS 6.
Не уж то за 20 лет не придумали чего-нибудь более удобного чем вся эта куча бойлерплейта, в котором легко допустить ошибку?

Я пишу на embedded C++, там и такого щастья нет.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715950
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZ,

C/C++ вообще языки, использование которых суть всегда хотьба по канату без страховки.
Для всех остальных, кто боится испачкать руки есть PowerShell и .Net
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715952
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так работает внутри EXE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
extern "C" __declspec(dllexport) void test_exp(const char* text) {
	printf("%s\n", text);
}

int main(){

	typedef void(__cdecl *p_test_exp)(const char*);
	p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), "test_exp");
	if (test_exp_fn == NULL) {
		printf("test_exp_fn() not found \n");
		return 1;
	}
	test_exp_fn("OK");
	return 0;
}
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715965
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТак работает внутри EXE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
extern "C" __declspec(dllexport) void test_exp(const char* text) {
	printf("%s\n", text);
}

int main(){

	typedef void(__cdecl *p_test_exp)(const char*);
	p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), "test_exp");
	if (test_exp_fn == NULL) {
		printf("test_exp_fn() not found \n");
		return 1;
	}
	test_exp_fn("OK");
	return 0;
}



Спасибо!

Сделал по примеру, функция появилась в списке экспортируемых функций, но по имени не находится.
Подозреваю, что дело в кодировке , т.к. чтобы проект откомпилировался, приходится добавлять L перед именем функции

Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), L"test_exp");
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715973
SLab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715979
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SLabSergey_rb,
Это ?
https://metanit.com/cpp/tutorial/4.8.php

Не это.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715981
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima TТак работает внутри EXE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
extern "C" __declspec(dllexport) void test_exp(const char* text) {
	printf("%s\n", text);
}

int main(){

	typedef void(__cdecl *p_test_exp)(const char*);
	p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), "test_exp");
	if (test_exp_fn == NULL) {
		printf("test_exp_fn() not found \n");
		return 1;
	}
	test_exp_fn("OK");
	return 0;
}



Спасибо!

Сделал по примеру, функция появилась в списке экспортируемых функций, но по имени не находится.
Подозреваю, что дело в кодировке , т.к. чтобы проект откомпилировался, приходится добавлять L перед именем функции

Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), L"test_exp");



Если не ставить L перед "text_exp" , то ошибка

Код: plaintext
1.
error C2664: 'GetProcAddressW' : cannot convert parameter 2 from 'char [9]' to 'const unsigned short *'
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715988
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если делать так

Код: plaintext
1.
 p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), (unsigned short*) "test_exp");



то все равно не находится.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715997
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb, а так?:
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), std::wstring("test_exp"));
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715998
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЕсли не ставить L перед "text_exp" , то ошибка
Ошибка потому что у тебя проект юникодный, значит надо ставить L.
У меня проект не юникодный, мне не надо ставить.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716001
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЕсли делать так

Код: plaintext
1.
 p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), (unsigned short*) "test_exp");



то все равно не находится.

Ты просто используй имена, которые реально экспортируются dll - http://www.dependencywalker.com/
Может, там и нет того, что ты ищешь.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716002
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devSergey_rb, а так?:
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), std::wstring("test_exp"));



Код

Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), (wstring) "test_exp");



Ошибка

автор error C2440: 'type cast' : cannot convert from 'char [9]' to 'class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >'
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716005
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияSergey_rbЕсли делать так

Код: plaintext
1.
 p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), (unsigned short*) "test_exp");



то все равно не находится.

Ты просто используй имена, которые реально экспортируются dll - http://www.dependencywalker.com/
Может, там и нет того, что ты ищешь.

Я открываю exe в TotalCommander через F3
В разделе экспорта вижу экспротированную функцию test_exp

Думаю, что дело все таки в кодировках.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716007
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для тебя правильно так
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), L"test_exp");



Если хочешь чтобы скомпилировалось без L, то в свойствах проекта переключи General - Charaster set = Not set. Но это повлияет на весь проект и в другом месте может перестать компилироваться.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716008
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДля тебя правильно так
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), L"test_exp");



Если хочешь чтобы скомпилировалось без L, то в свойствах проекта переключи General - Charaster set = Not set. Но это повлияет на весь проект и в другом месте может перестать компилироваться.


Переключатель не нашел, в опциях проекта прописано следующее

Код: plaintext
1.
/nologo /W3 /Zi /Od /D "DEBUG" /D "ARM" /D "_ARM_" /D "ARMV4" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /Fp"ARMV4Dbg/eTest3.pch" /Yu"stdafx.h" /Fo"ARMV4Dbg/" /Fd"ARMV4Dbg/" /M$(CECrtMTDebug) /c 
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716010
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

ну ты первым параметром в GetProcAddress() хоть хэндл загруженной библиотеки используешь?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716012
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияSergey_rb,

ну ты первым параметром в GetProcAddress() хоть хэндл загруженной библиотеки используешь?

Я не загружаю библиотеку, я ищу функцию в exe.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716014
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это убрать
Код: plaintext
1.
/D "UNICODE" /D "_UNICODE"



но если у тебя имя функции придет как wstring, то правильнее добавить L. Иначе потом надо будет wstring конвертировать в string.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716017
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОшибка потому что у тебя проект юникодный, значит надо ставить L.
У меня проект не юникодный, мне не надо ставить.Так он уже ставил L перед литералом...
Может у него проект наоборот - неюникодный?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716018
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb...
Я открываю exe в TotalCommander через F3
В разделе экспорта вижу экспротированную функцию test_exp
...
Скриншот покажи.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716019
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devDima TОшибка потому что у тебя проект юникодный, значит надо ставить L.
У меня проект не юникодный, мне не надо ставить.Так он уже ставил L перед литералом...
Может у него проект наоборот - неюникодный?
Ставил и работало 21701299
Sergey_rbЕсли не ставить L перед "text_exp" , то ошибка
ХЗ почему эта L его смутила.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716020
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Trdb_devпропущено...
Так он уже ставил L перед литералом...
Может у него проект наоборот - неюникодный?
Ставил и работало 21701299
Sergey_rbЕсли не ставить L перед "text_exp" , то ошибка
ХЗ почему эта L его смутила.

С буквой L не находит функцию

Какой тогда тип передавать в эту функцию?

автор wstring f_name;

p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), f_name)

Выдает ошибку
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716021
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

Ставил и работало 21701299
пропущено...

ХЗ почему эта L его смутила.

С буквой L не находит функцию

Какой тогда тип передавать в эту функцию?

автор wstring f_name;

p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), f_name)

Выдает ошибку

Ошибка

Код: plaintext
1.
 error C2664: 'GetProcAddressW' : cannot convert parameter 2 from 'class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >' to 'const unsig
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716029
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbавтор wstring f_name;

p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), f_name)

Выдает ошибку
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), f_name.c_str());
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716036
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

Ставил и работало 21701299
пропущено...

ХЗ почему эта L его смутила.

С буквой L не находит функцию
Странно. Похоже какие-то особенности компилятора.
Попробуй так без L
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddressA(GetModuleHandle(NULL), "test_exp");
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716040
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я видимо совсем тупой

автор wstring f_name;

f_name.append(L"test_exp");

p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), f_name.c_str());


Не находит функцию.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716044
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbпропущено...


С буквой L не находит функцию
Странно. Похоже какие-то особенности компилятора.
Попробуй так без L
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddressA(GetModuleHandle(NULL), "test_exp");



Проект скомпилировался, но функция не нашлась

может проблема в
Код: plaintext
1.
GetModuleHandle(NULL)
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716051
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЯ видимо совсем тупой

автор wstring f_name;

f_name.append(L"test_exp");

p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), f_name.c_str());


Не находит функцию.
Ты не торопись wstring использовать. Добейся для начала повторения работы моего примера 21701426


У тебя таких функций много будет? Если немного, то проще как-то так сделать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void run_func(const wstring& f_name) {
  if(f_name == L"fn1") {
     fn1();
  } else if(f_name == L"fn2") {
     fn2();
  } else {
     // Ошибка. Неизвестная функция 
  }
}


Или в std::map загнать список функций при старте проги.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716056
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

Странно. Похоже какие-то особенности компилятора.
Попробуй так без L
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddressA(GetModuleHandle(NULL), "test_exp");



Проект скомпилировался, но функция не нашлась

может проблема в
Код: plaintext
1.
GetModuleHandle(NULL)


По хэлпу это должен быть хэндл EXE. Ты же в EXE этот код вставил?
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms683199(v=vs.85).aspx If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process (.exe file).
Можешь проверку добавить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int main() {
	HMODULE h = GetModuleHandle(NULL);
	if (h == NULL) {
		printf("GetModuleHandle() error \n");
		return 2;
	}
	typedef void(__cdecl *p_test_exp)(const char*);
	p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(h, "test_exp");
	if (test_exp_fn == NULL) {
		printf("test_exp_fn() not found \n");
		return 1;
	}
	test_exp_fn("OK");
	return 0;
}
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716101
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил, хендл формы находится.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716106
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция по прежнему не находится
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716110
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbЯ видимо совсем тупой

пропущено...



Не находит функцию.
Ты не торопись wstring использовать. Добейся для начала повторения работы моего примера 21701426


У тебя таких функций много будет? Если немного, то проще как-то так сделать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void run_func(const wstring& f_name) {
  if(f_name == L"fn1") {
     fn1();
  } else if(f_name == L"fn2") {
     fn2();
  } else {
     // Ошибка. Неизвестная функция 
  }
}


Или в std::map загнать список функций при старте проги.

Это на крайний случай.
Хотел сделать как в Дельфи.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716115
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbХотел сделать как в Дельфи.
Хотел - делай. В Си тоже есть процедурный тип. Более, того, он практически ничем не отличается от дельфийского. Поэтому начни с того, что покажи нам свой дельфийский код, а то местные гуру совсем в глухие дебри уйдут.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716127
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

Мне как-то пришлось использовать функцию из одной библиотечки, она была описана вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdint.h>

#ifdef __cplusplus
extern "C"{
#endif//__cplusplus
	// Initialize recognition library
	__declspec(dllexport) extern uint32_t __stdcall GenerateECCPair(unsigned char* privateCode, uint32_t privateLen, unsigned char* publicCode, uint32_t publicLen);
#ifdef __cplusplus
}
#endif//__cplusplus


Так вот, при попытке найти функцию "GenerateECCPair" ни черта не получалось,
я посмотрел с помощью http://www.dependencywalker.com/, и фактическое имя функции оказалось равным "_GenerateECCPair@16".
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716178
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия,

Потому рекомендуется все экспортировать как extern "C"
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716199
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglКотовасия,

Потому рекомендуется все экспортировать как extern "C"
Чужай dll-ка была, без исходников.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716210
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияSergey_rb,

Мне как-то пришлось использовать функцию из одной библиотечки, она была описана вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdint.h>

#ifdef __cplusplus
extern "C"{
#endif//__cplusplus
	// Initialize recognition library
	__declspec(dllexport) extern uint32_t __stdcall GenerateECCPair(unsigned char* privateCode, uint32_t privateLen, unsigned char* publicCode, uint32_t publicLen);
#ifdef __cplusplus
}
#endif//__cplusplus


Так вот, при попытке найти функцию "GenerateECCPair" ни черта не получалось,
я посмотрел с помощью http://www.dependencywalker.com/, и фактическое имя функции оказалось равным "_GenerateECCPair@16".
Не знаю как в студии, а в GCC можно заманглить хоть что . В коде это можно сделать через вызов abi::__cxa_demangle, ну и потом уже передать в dlsym.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716264
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglПотому рекомендуется все экспортировать как extern "C"

Если ты не заметил, то там именно так и делается. Но у stdcall свои правила.
В любом случае это не то, что надо аффтару.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716280
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я правильно понял, что задача с кодировками не решаема?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716294
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты можешь скриншот приложить со списком экспортируемых функций модуля?

Sergey_rbЯ правильно понял, что задача с кодировками не решаема?
Решаема.
Разными методами. Методом перебора, метод ветвей и границ, метод эластичной сети, метод отжига - много их.

А что за "задача с кодировками"? Ну вот кто, кроме тебя может знать опции твоего проекта?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716342
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияТы можешь скриншот приложить со списком экспортируемых функций модуля?

Sergey_rbЯ правильно понял, что задача с кодировками не решаема?
Решаема.
Разными методами. Методом перебора, метод ветвей и границ, метод эластичной сети, метод отжига - много их.

А что за "задача с кодировками"? Ну вот кто, кроме тебя может знать опции твоего проекта?

Тот, кто умеет читать

Код: plaintext
1.
/nologo /W3 /Zi /Od /D "DEBUG" /D "ARM" /D "_ARM_" /D "ARMV4" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /Fp"ARMV4Dbg/eTest3.pch" /Yu"stdafx.h" /Fo"ARMV4Dbg/" /Fd"ARMV4Dbg/" /M$(CECrtMTDebug) /c 
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716354
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТак работает внутри EXE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
extern "C" __declspec(dllexport) void test_exp(const char* text) {
	printf("%s\n", text);
}

int main(){

	typedef void(__cdecl *p_test_exp)(const char*);
	p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), "test_exp");
	if (test_exp_fn == NULL) {
		printf("test_exp_fn() not found \n");
		return 1;
	}
	test_exp_fn("OK");
	return 0;
}



Сделал как описано выше. В UNICODE все работает без L/
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716360
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня без L не компилируется
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716361
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserDima TТак работает внутри EXE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
extern "C" __declspec(dllexport) void test_exp(const char* text) {
	printf("%s\n", text);
}

int main(){

	typedef void(__cdecl *p_test_exp)(const char*);
	p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), "test_exp");
	if (test_exp_fn == NULL) {
		printf("test_exp_fn() not found \n");
		return 1;
	}
	test_exp_fn("OK");
	return 0;
}



Сделал как описано выше. В UNICODE все работает без L/
Как ни странно у меня тоже работает в MSVC2017. К сожалению не могу затестить в других компиляторах от MS, но судя по ошибкам у ТС 21701299 , другие компиляторы MS считают по другому.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716364
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКак ни странно у меня тоже работает в MSVC2017. К сожалению не могу затестить в других компиляторах от MS, но судя по ошибкам у ТС 21701299 , другие компиляторы MS считают по другому.
У меня 2012
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716389
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbКотовасияТы можешь скриншот приложить со списком экспортируемых функций модуля?

пропущено...

Решаема.
Разными методами. Методом перебора, метод ветвей и границ, метод эластичной сети, метод отжига - много их.

А что за "задача с кодировками"? Ну вот кто, кроме тебя может знать опции твоего проекта?

Тот, кто умеет читать

Код: plaintext
1.
/nologo /W3 /Zi /Od /D "DEBUG" /D "ARM" /D "_ARM_" /D "ARMV4" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /Fp"ARMV4Dbg/eTest3.pch" /Yu"stdafx.h" /Fo"ARMV4Dbg/" /Fd"ARMV4Dbg/" /M$(CECrtMTDebug) /c 

Понимаешь у тех, кто "умеет читать" кто здесь отвечает, таких проблем просто нет...

Потому не умничай, а давай всю инфу, что просят.

Ты же в С++ базовом ни бум бум, не то что в тонкостях системных ньюансов.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716483
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы все на мерседесах студиях, я у меня запорожец Emdedded C++
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716512
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbВы все на мерседесах студиях, я у меня запорожец Emdedded C++
То есть, на вопросы ты отвечать не будешь, понятно. Зачем пришел?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716588
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияSergey_rbВы все на мерседесах студиях, я у меня запорожец Emdedded C++
То есть, на вопросы ты отвечать не будешь, понятно. Зачем пришел?

Я уже на все ответил.

Без буквы L не компилируется, а с буквой L не находит функцию по имени.

Функция экспортируется, файл со скрином приложил.

Какие еще были вопросы?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716608
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТак работает внутри EXE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
extern "C" __declspec(dllexport) void test_exp(const char* text) {
	printf("%s\n", text);
}

int main(){

	typedef void(__cdecl *p_test_exp)(const char*);
	p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), "test_exp");
	if (test_exp_fn == NULL) {
		printf("test_exp_fn() not found \n");
		return 1;
	}
	test_exp_fn("OK");
	return 0;
}


Разве тут не __declspec(dllimport) должно быть? Хотя это не внешняя dll, но все же
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716617
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbКакие еще были вопросы?

Был вопрос почему ты не сделаешь точно так же как в Delphi, поскольку в Си тоже есть
процедурные типы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716621
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

не надо смотреть Тоталом - он декорирование убирает

посмотри в бинарном виде содержимое (раз Юникодный проект, то буквы будут чередоваться через 0)

или есть есть в той версии >dumpbin /exports test64.exe
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716645
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я просто оставлю здесь этот код, написанный за пять минут.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
#include <stdio.h>
#include <string.h>

void foo(int x)
{
  printf("foo(%d)\n", x);
}

void bar(int x)
{
  printf("bar(%d)\n", x);
}

typedef void func(int x);

struct func_match
{
  const char* name;
  func* f;
};

func_match list[] = {{"foo", foo}, {"bar", bar}, {NULL, NULL}};

void call(const char* name, int x)
{
  for (int i = 0; list[i].name != NULL; i++)
  {
    if (strcmp(list[i].name, name) == 0)
    {
      list[i].f(x);
      return;
    }
  }
  printf("cannot call %s(%d)\n", name, x);
}

int main()
{
  call("foo", 1);
  call("bar", 2);
  call("shit", 666);
}

...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716664
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

Такой вариант не пробовали
Код: plaintext
1.
2.
3.
4.
5.
6.
#ifndef UNDER_CE
string f_name = ANSI(func_name);
FARPROC f = GetProcAddress(h, f_name.data());
#else
FARPROC f = GetProcAddress(h, func_name);
#endif



Взято тут
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716790
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbВозникла необходимость поиска функции по ее имени

Ты функцию-то нашёл?
...
Рейтинг: 0 / 0
67 сообщений из 67, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как найти функцию по ее имени?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]