информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыSpanning Tree Protocol: недокументированное применениеСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Проблемы с подлинковкой DLL. Нужна помощь!!! 03.07.02 22:33  Число просмотров: 941
Автор: looptop Статус: Незарегистрированный пользователь
<"чистая" ссылка>
А как сделать правильно по первому пункту и по второму...

по второму я пробовал добавлять WINAPI: "...void WINAPI main(......", но в этом случае у меня получается, что не находится функция main из библиотеки....

Был бы очень признателен, если бы ты помог и объяснил мне поподробнее :)

> 1) как то это не хорошо определять main() с нестандартными
> параметрами
>
> 2) не линкуется потому что в main не указал WINAPI
<programming>
[C++] Проблемы с подлинковкой DLL. Нужна помощь!!! 03.07.02 18:18  
Автор: looptop Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Привет. При выходе из функции, указатель на которую мы взяли из подлинкованной библиотеки, проиходит ошибка такого характера: (я не могу понять в чём причина)
--------------------------------------------------------------------------------------
Debug Error!

Program: C:\temp\Cpp2.exe
Module:
File: i386\chkesp.c
Line: 42

The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
---------------------------------------------------------------------------------------
А ошибка происходит при выходе из:

EXECFUNC(psrc,sum);

Исходной код программы:
---------------------------------------------------------------------------------------
typedef void (WINAPI*pFUNC)(int*,int);
.....
HINSTANCE hLib;
pFUNC EXECFUNC;
.....
hLib=LoadLibrary("TempLibrary/tmplib.dll");
EXECFUNC=(pFUNC)GetProcAddress(hLib, "main");
.....
if(EXECFUNC==NULL)
{
FreeLibrary((HMODULE)hLib);
return -4;
}

printf("before: sum = %d\n",sum);
EXECFUNC(psrc,sum); //при выходе - ошибка
printf("after: sum = %d\n",sum);


FreeLibrary((HMODULE)hLib);
.....
---------------------------------------------------------------------------------------

Код самой библиотеки:

#include "stdafx.h"
#include <stdio.h>

extern "C" __declspec(dllexport) void main(int *psrc,int sum)
{
printf("+IN LIBRARY MAIN()+\n");

for(int i=0;i<9;i++) {
printf("src[%d] = %d\n",i,psrc[i]);
sum+=psrc[i];
}

printf("Sum = %d\n",sum);


return;
}
---------------------------------------------------------------------------------------

Помогите понять в чём проблема?!!!

С Уважением looptop!
[C++] Проблемы с подлинковкой DLL. Нужна помощь!!! 03.07.02 21:14  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
1) как то это не хорошо определять main() с нестандартными параметрами

2) не линкуется потому что в main не указал WINAPI
[C++] Проблемы с подлинковкой DLL. Нужна помощь!!! 03.07.02 22:33  
Автор: looptop Статус: Незарегистрированный пользователь
<"чистая" ссылка>
А как сделать правильно по первому пункту и по второму...

по второму я пробовал добавлять WINAPI: "...void WINAPI main(......", но в этом случае у меня получается, что не находится функция main из библиотеки....

Был бы очень признателен, если бы ты помог и объяснил мне поподробнее :)

> 1) как то это не хорошо определять main() с нестандартными
> параметрами
>
> 2) не линкуется потому что в main не указал WINAPI
[C++] Проблемы с подлинковкой DLL. Нужна помощь!!! 04.07.02 02:27  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
1) просто назови функцию по другому (напр. MyProc())
main() в C занята и не используется в dll

2) в зависимости от типа функции к её имени могут добавляться разные значки (декорированное имя)
чтобы экспортировать функцию с нужным именем укажи в параметрах линкера /export:exportName=internalName
(а вот здесь уже ничто не мешает exportName задать как main, т.е. /export:main=MyProc)
[C++] У тебя срыв стека потому, что: 04.07.02 04:12  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
ф-ция объявлена как __declspec, значит после выхода из нее вызывающий код сам должен удалять переменные из стека:
PUSH Par1
.
.
.
PUSH ParN
CALL Function
ADD ESP,N,
а вызываешь ты ее по умолчанию как __stdcall. __stdcall - ф-ции сами должны "убирать за собой" вот так:
RET N.
В твоем это должно выглядеть так:
EXECFUNC=((void __declspec(*)(int *,int))GetProcAddress(hLib, "main");
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach