Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.036 c
11-1078525189
Dream
2004-03-06 01:19
2004.08.08
Proxies.dcu


3-1089617066
Prohodil Mimo
2004-07-12 11:24
2004.08.08
При загрузке системы почему-то стал отключаться сервер ИБ.


14-1090246065
X9
2004-07-19 18:07
2004.08.08
Linux и Window$ на одном винте.


1-1090497810
Mielofon
2004-07-22 16:03
2004.08.08
Куда девать файлы?


14-1090399956
Esu
2004-07-21 12:52
2004.08.08
Во дают!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский