| 
 
 
 
 Легенда:
  новое сообщение 
  закрытая нитка 
  новое сообщение 
  в закрытой нитке 
  старое сообщение   | 
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
Новичкам также крайне полезно ознакомиться с данным документом.
|  | [C++] Проблемы с подлинковкой DLL. Нужна помощь!!!  03.07.02 21:14  Число просмотров: 1198 Автор: ggg <ggg> Статус: Elderman
 |  
| 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");
 |  
 
 
 |  |