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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2012, 16:17   #1
alex161
Пользователь
 
Регистрация: 31.01.2012
Сообщений: 10
Вопрос использование GetProcAddress

Кто-то может на примере подсказать...
Вот есть библиотека dll
Код:
if (SetDllDirectory(reg_data) == NULL){
		printf("Error add library path \"%S\"",reg_data);
		getchar();
		return(-1);
	}
	if ((hNSS = LoadLibrary(LIBNSS)) == NULL){
		printf("Error load library \"%S\"",LIBNSS);
		getchar();
		return(-1);
	}
Есть функция в ней
Код:
SECItem *NSSBase64_DecodeBuffer (PRArenaPool *arenaOpt, SECItem *outItemOpt,const char *inStr, unsigned int inLen)
Как её использовать?
Пробовал так:
Код:
typedef SECItem *	   (*NSSBase64_DecodeBuffer)(void *,struct SECItem *,const char *,unsigned int);
Код:
(FARPROC &)NSSBase64_DecodeBuffer = GetProcAddress(hNSS,NSSBASE64_DECODEBUFFER)
И лезут ошибки типа "syntax error" и "type name is not allowed" соответственно
alex161 вне форума Ответить с цитированием
Старый 04.02.2012, 17:03   #2
optimator
Пользователь
 
Регистрация: 12.11.2010
Сообщений: 92
По умолчанию

попробуй так
Код:
typedef SECItem *	   (NSSBase64_DecodeBuffer)(void *,struct SECItem *,const char *,unsigned int);

NSSBase64_DecodeBuffer *fun = (NSSBase64_DecodeBuffer *)GetProcAddress(hNSS,NSSBASE64_DECODEBUFFER)
optimator вне форума Ответить с цитированием
Старый 04.02.2012, 18:51   #3
alex161
Пользователь
 
Регистрация: 31.01.2012
Сообщений: 10
По умолчанию

Не, друг, не помогает, даже когда просто определение:
Цитата:
Код:
typedef SECItem *	   (NSSBase64_DecodeBuffer)(void *,struct SECItem *,const char *,unsigned int);
Уже ошибка выскакивает:
Код:
Error	1	error C2143: syntax error : missing '{' before '*'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	72
А когда добавляю в тело вторую строчку, то колличество ошибок лавинообразно увеличивается:

Код:
Error	6	error C2059: syntax error : ')'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	273
Error	4	error C2065: 'fun' : undeclared identifier	D:\Work\mozilla_passwd\mozilla_passwd\main.c	273
Error	1	error C2143: syntax error : missing '{' before '*'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	72
Error	5	error C2296: '*' : illegal, left operand has type 'int *(__cdecl *)(void *,SECItem *,const char *,unsigned int)'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	273
Место в коде выглядит так:

Код:
int main(int argc, char* argv[],char *envp[]){

блаблабла...

	if (SetDllDirectory(reg_data) == NULL){
		printf("Error add library path \"%S\"",reg_data);
		getchar();
		return(-1);
	}
	if ((hNSS = LoadLibrary(LIBNSS)) == NULL){
		printf("Error load library \"%S\"",LIBNSS);
		getchar();
		return(-1);
	}
	NSSBase64_DecodeBuffer *fun = (NSSBase64_DecodeBuffer *)GetProcAddress(hNSS,NSSBASE64_DECODEBUFFER);
	if (get_from_sqlite() != 0){
		printf("Error read sqlite \"%S\"",LIBSQLITE);
		getchar();
		return(-1);
	}
	FreeLibrary(hNSS);
	getchar();
	return 0;
}

Последний раз редактировалось alex161; 04.02.2012 в 18:55.
alex161 вне форума Ответить с цитированием
Старый 04.02.2012, 19:54   #4
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Не используй typedef.

SECItem (WINAPI* NSSBase64_DecodeBuffer)(PRArenaPool *arenaOpt, SECItem *outItemOpt,const char *inStr, unsigned int inLen)

(FARPROC &)NSSBase64_DecodeBuffer = GetProcAddress(hNSS ,"NSSBASE64_DECODEBUFFER");

Последний раз редактировалось crymchanin; 04.02.2012 в 20:17.
crymchanin вне форума Ответить с цитированием
Старый 04.02.2012, 20:16   #5
alex161
Пользователь
 
Регистрация: 31.01.2012
Сообщений: 10
По умолчанию

Без него так:
Код:
	19	IntelliSense: identifier "NSSBase64_DecodeBuffer" is undefined	d:\work\mozilla_passwd\mozilla_passwd\main.c	271
	20	IntelliSense: identifier "fun" is undefined	d:\work\mozilla_passwd\mozilla_passwd\main.c	271
	21	IntelliSense: expected an expression	d:\work\mozilla_passwd\mozilla_passwd\main.c	271
	22	IntelliSense: expected a ';'	d:\work\mozilla_passwd\mozilla_passwd\main.c	271
Error	15	error C2065: 'NSSBase64_DecodeBuffer' : undeclared identifier	D:\Work\mozilla_passwd\mozilla_passwd\main.c	271
Error	17	error C2065: 'NSSBase64_DecodeBuffer' : undeclared identifier	D:\Work\mozilla_passwd\mozilla_passwd\main.c	271
Error	16	error C2065: 'fun' : undeclared identifier	D:\Work\mozilla_passwd\mozilla_passwd\main.c	271
Error	18	error C2059: syntax error : ')'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	271
alex161 вне форума Ответить с цитированием
Старый 04.02.2012, 20:26   #6
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Такая реализация должна быть:

Код:
int main(int argc, char* argv[],char *envp[]){

блаблабла...

	if (SetDllDirectory(reg_data) == NULL){
		printf("Error add library path \"%S\"",reg_data);
		getchar();
		return(-1);
	}
	if ((hNSS = LoadLibrary(LIBNSS)) == NULL){
		printf("Error load library \"%S\"",LIBNSS);
		getchar();
		return(-1);
	}
	SECItem (WINAPI* NSSBase64_DecodeBuffer)(PRArenaPool *arenaOpt, SECItem *outItemOpt,const char *inStr, unsigned int inLen);
	(FARPROC &)NSSBase64_DecodeBuffer = GetProcAddress(hNSS ,"NSSBASE64_DECODEBUFFER");
	if (get_from_sqlite() != 0){
		printf("Error read sqlite \"%S\"",LIBSQLITE);
		getchar();
		return(-1);
	}
	FreeLibrary(hNSS);
	getchar();
	return 0;
}
У тебя так-же?
crymchanin вне форума Ответить с цитированием
Старый 04.02.2012, 20:38   #7
alex161
Пользователь
 
Регистрация: 31.01.2012
Сообщений: 10
По умолчанию

Ну вот если так:
Код:
	SECItem (WINAPI* NSSBase64_DecodeBuffer)(void *arenaOpt, SECItem *outItemOpt,const char *inStr, unsigned int inLen);
	(FARPROC &)NSSBase64_DecodeBuffer = GetProcAddress(hNSS ,"NSSBASE64_DECODEBUFFER");
Правда как видишь первый параметр делаю void, из-за ненадобности... Там большая череда определений структур невостребованная, всё равно NULL должен подаваться. Или из-за этого нетипизированного указателя могут быть такие ошибки, как в этом случае у меня:
Код:
Error	16	error C2143: syntax error : missing ')' before '__stdcall'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	272
Error	18	error C2143: syntax error : missing ')' before '&'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	273
Error	17	error C2059: syntax error : ')'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	272
Error	19	error C2059: syntax error : ')'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	273
alex161 вне форума Ответить с цитированием
Старый 04.02.2012, 20:48   #8
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Цитата:
Сообщение от alex161 Посмотреть сообщение
Правда как видишь первый параметр делаю void, из-за ненадобности... Там большая череда определений структур невостребованная, всё равно NULL должен подаваться.
Насколько я знаю все аргументы в прототипе функции должны быть такими-же как и в самой функции.

Цитата:
Сообщение от alex161 Посмотреть сообщение
Или из-за этого нетипизированного указателя могут быть такие ошибки, как в этом случае у меня:
Исходя из сообщения компилятора, у тебя синтаксическая ошибка. Или не поставленная скобка ")" или пропущена точка/запятая ";" (она кстати должна присутствовать после закрывающей дужки "}" структуры, как и в классах).
crymchanin вне форума Ответить с цитированием
Старый 04.02.2012, 20:58   #9
alex161
Пользователь
 
Регистрация: 31.01.2012
Сообщений: 10
По умолчанию

Цитата:
Исходя из сообщения компилятора, у тебя синтаксическая ошибка. Или не поставленная скобка ")" или пропущена точка/запятая ";" (она кстати должна присутствовать после закрывающей дужки "}" структуры, как и в классах).
Так вот эти строки закоменчиваю и всё огонь!!!

Ну ща попробую всё указать... указал, всё как у тебя, вот выход:
Код:
Error	16	error C2143: syntax error : missing ')' before '__stdcall'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	290
Error	18	error C2143: syntax error : missing ')' before '&'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	291
Error	17	error C2059: syntax error : ')'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	290
Error	19	error C2059: syntax error : ')'	D:\Work\mozilla_passwd\mozilla_passwd\main.c	291
О! Кстати от определения типа указателя ошибки не поменялись))

Собстно есть вырезка из рабочего кода ещё(друг подсуетил):


Код:
typedef int (* _sqlite3_blob_read)(sqlite3_blob * pDB, void *Z, int N, int iOffset);

_sqlite3_blob_read __sqlite3_blob_read = NULL;

BOOL SqliteInit()
{
	hSqlite = LoadLibraryA("sqlite3.dll");
	if (hSqlite == NULL)
	{
		return FALSE;
	}
	
	__sqlite3_blob_read = (_sqlite3_blob_read)GetProcAddress(hSqlite,"sqlite3_blob_read");


	return TRUE;
}

void SqliteFree()
{
	if (hSqlite != NULL)
		FreeLibrary(hSqlite);
	hSqlite = NULL;
	__sqlite3_blob_read = NULL;
}


int sqlite3_blob_read(sqlite3_blob * pDB, void *Z, int N, int iOffset)
{
	return __sqlite3_blob_read(pDB,Z,N,iOffset);
}

Последний раз редактировалось alex161; 04.02.2012 в 21:09. Причина: новенькое
alex161 вне форума Ответить с цитированием
Старый 04.02.2012, 21:13   #10
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Ну как я понял PRArenaPool *arenaOpt - указатель на структуру. И эта ошибка из-за указанного void*. Нужно создать такую структуру в коде. Я думаю после правильного создания структуры, никаких ошибок возникать не должно.
crymchanin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование (...) в с++ Byurrer Общие вопросы C/C++ 12 06.04.2011 23:04
Использование ffFixed Wild_klas Помощь студентам 1 22.01.2011 14:40
GetProcAddress legendary Win Api 4 18.10.2010 15:55
проблемы с GetProcAddress waryg Win Api 4 06.04.2010 11:30
Использование while и while do prikolist Общие вопросы C/C++ 20 06.04.2009 18:40