Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DLL: C -> Pas ??? [D5, Win2k, WinXP]


Eugenez ©   (2004-07-22 17:21:00) 

Пробовал переписать на Delphi popup-модуль DLL c C++.
Ошибок приложение вызывающее мою dll не дает, однако и НЕ загружается...((
Help needed!!!
Оригинал popup на C++ в конце.

-----------------------------------------------
library gatemsg;

uses
 ShareMem,
 SysUtils,
 Windows,
 Classes;

function GetMajorVersion(): integer; export;
begin
  result:=1;
end;

function GetMinorVersion(): integer; export;
begin
  result:=0;
end;

{/**
* Инициализация подключаемого модуля
* @param szConfigPath [in] путь к конфигурационному файлу
* @return код ошибки
*/}
function InitAppender(const szConfigPath:PChar): integer; export;
var nRes: integer;
begin
   nRes   := 0;
   result := nRes;
end;

{
* Деинициализация подключаемого модуля
* @return код ошибки
*/}
function DeinitAppender(): integer; export;
var nRes: integer;
begin
   nRes   := 0;
   result := nRes;
end;

{
/**
* сообщение
* @param nPriority [in] уровень приоритета сообщения, см.  @param szMessage [in] текст сообщения
* @return код ошибки
*/ }
function LogMessage(nPriority: integer; const szMessage:PChar): integer; export;
var nRes: integer;
   Prior: string;
begin
   nRes   := 0;
   if (nPriority > 1) then result:=nRes;
   MessageBeep(1);
   MessageBox(NULL, szMessage, Pchar('msg level'), MB_OK + MB_ICONERROR);
   result := nRes;
end;

exports
 GetMajorVersion name 'GetMajorVersion',
 GetMinorVersion name 'GetMinorVersion',
 InitAppender    name 'InitAppender',
 DeinitAppender  name 'DeinitAppender',
 LogMessage      name 'LogMessage';

begin
end.

/********************************************************************

       Filename        :       popup.cpp
       Description     :       реализация подключаемого модуля ********************************************************************/

#include <windows.h>

#include "logapp.h"

#if defined(__cplusplus)
extern "C" {
#endif

LOGAPP_API int LOGAPP_DECL GetMajorVersion(void){
       return 1;
}

LOGAPP_API int LOGAPP_DECL GetMinorVersion(void){
       return 0;
}

/**
* Инициализация подключаемого модуля
* @param szConfigPath [in] путь к конфигурационному файлу
* @return код ошибки
*/
LOGAPP_API int LOGAPP_DECL InitAppender(const char* szConfigPath){
       int nRes = 0;
       return nRes;    
}

/**
* Деинициализация подключаемого модуля
* @return код ошибки
*/
LOGAPP_API int LOGAPP_DECL DeinitAppender(void){
       int nRes = 0;
       return nRes;
}

/**
* сообщение
* @param nPriority [in] уровень приоритета сообщения, см.  @param szMessage [in] текст сообщения
* @return код ошибки
*/
LOGAPP_API int LOGAPP_DECL LogMessage(int nPriority, const char* szMessage){
       int nRes = 0;
       
       if(nPriority>1) return nRes;

       ::MessageBeep(-1);
       ::MessageBox(NULL, szMessage, "Popup Message", MB_OK | MB_ICONERROR);

       return nRes;
}

#if defined( __cplusplus )
}
#endif


han_malign   (2004-07-22 18:02:00) [1]

кстати uses ShareMem, SysUtils, Classes - здесь совершенно лишние, пока не ипользуются динамические строки/массивы - ShareMem не нужен...


han_malign   (2004-07-22 17:58:00) [2]

> по умолчанию C++ используется модель вызова stdcall или cdecl
extern "C" {...} - означает cdecl, без декорации
вопрос, какая компоновка подразумевается в макросе LOGAPP_DECL

хотя раз не падает, скорее всего cdecl, c stdcall(или pascal) - словил бы stack overflow...


ИдиотЪ   (2004-07-22 17:29:00) [3]


var nRes: integer;
begin
  nRes   := 0;
  ???
  result := nRes;
end;

ты видать чего-то не дописываешь, хитришь )
а какая процедура не загружается?


Григорьев Антон   (2004-07-22 17:29:00) [4]


> function InitAppender(const szConfigPath:PChar): integer;
>


Например, вот эта строка сразу наводит на подозрения. const char* Var в C++ должен переводится не как const Var:PChar, а как Var:PChar - слова const в C++ и Delphi имеют разные смыслы. Кроме того, по умолчанию C++ используется модель вызова stdcall или cdecl, а в Delphi - register. Выясните, какая модель вызова функций у исходной библиотеки и укажите такую же модель в своих функциях. Кроме того, в C++ существует т.н. декорация имён - когда компилятор реально назначает имена функций, отличные от тех, что используются в программе. Посмотрите с помощью tdump или depends имена в исходной dll и, при необходимости, укажите такие же имена в разделе exports.


Наверх

Титульная страница Поиск, карта сайта Написать письмо