Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

DLL: C -> Pas ???   Найти похожие ветки 

 
Eugenez   (2004-07-22 17:21) [0]

Пробовал переписать на 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


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


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

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


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


> 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.


 
han_malign ©   (2004-07-22 17:58) [3]

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

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


 
han_malign ©   (2004-07-22 18:02) [4]

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



Страницы: 1 вся ветка

Текущий архив: 2004.08.08;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
3-1089721403
dem2
2004-07-13 16:23
2004.08.08
sql и dbf


3-1089703612
Koala
2004-07-13 11:26
2004.08.08
Проблема в составлении ХП


14-1090736418
Суслик
2004-07-25 10:20
2004.08.08
Отпуск


14-1090242201
pasha_golub
2004-07-19 17:03
2004.08.08
Шахматы: извращения, байки, приколы и т.д.


3-1089864565
CPAS
2004-07-15 08:09
2004.08.08
Пароль