Re: Помогите состыковатся с DLL написаной на C
От: Arsu Россия  
Дата: 06.12.04 07:50
Оценка:
А>Вопросы:
А>1. как привязать ету функции в Delphi к DLL и как правильно их использовать?
А>3. Как правильно обьявить LoginCryptObj?

Вот пример со статической линковкой библиотеки
                               INTERFACE

type
      pLoginCryptInfo = ^TLoginCryptInfo; 
      TLoginCryptInfo = record
        pseed :cardinal;
        k1    :cardinal; 
        k2    :cardinal;
        m_key :array [0..1] of cardinal;
        m_k1  :array [0..1] of cardinal;
        m_k2  :array [0..1] of cardinal;
      end;

      T62bytes = array[0..61] of byte;
      p62bytes = ^T62bytes;

//extern "C" void LoginCryptInit(LoginCryptObj *obj);
procedure LoginCryptInit( ALoginCryptObj :pLoginCryptInfo); cdecl;

//extern "C" void LoginCryptEncrypt(LoginCryptObj *obj, unsigned char *in, unsigned char *out, int len);
procedure LoginCryptEncrypt( ALoginCryptObj :pLoginCryptInfo; Ain, Aout :pchar; Alen :integer); cdecl;

//extern "C" int CalculateKeys( 
//BYTE Plaintext[62], BYTE Ciphertext[62], unsigned int *LoginSeed, 
//unsigned int *ClientLoginKey1, unsigned int *ClientLoginKey2);
function CalculateKeys(
APlaintext, ACiphertext : T62bytes;
ALoginSeed, AClientLoginKey1, ClientLoginKey2 :pcardinal) :integer; cdecl;

                             IMPLEMENTATION

const dllname = 'твоя_длл.dll';

procedure LoginCryptInit; external dllname name 'LoginCryptInit';
procedure LoginCryptEncrypt; external dllname name 'LoginCryptEncrypt';
function CalculateKeys; external dllname name 'CalculateKeys';


Возможные проблемы:
1. Падает при старте — возможно, не находит длл или функцию в длл. Название ф-ции нужно пишать, точно соблюдая регистр. (Чаще не падает, а пишет по-человечески, кстати
2. Насчёт cdecl я не уверен. Вполне может быть stdcall или ещё что-нить из соответствующего раздела хелпа Дельфи. Диагностика проблемы — как обычно — по частым падениям при вызовах ф-ций длл-ки.
3. T62bytes в третьей вполне возможно придётся заменить на p62bytes (или на pointer).
4. Можно попробовать загружать длл-ку динамически — через LoadLibrary. Но это бОльший гемор
5. Может быть, нужно packed record для TLoginCryptInfo... (маловероятно)


А>2. Sharemem нужен?


Если твоя длл-ка написана на C, то определённо не нужен.
Sharemem нужен, если ты пишешь длл-ку на Дельфи и намерен передавать параметры типа string (чего нормальные люди не делают, то есть она вообще не нужна).

А>4. Что еще необходимо?


Терпение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.