![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.