Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];




Вниз

Хочу чтобы меня видели !!! ( DLL ) 


Сенченко Андрей   (2001-12-29 14:20) [0]

Библиотека, скомпилированная из нижеприведенного текста упорно не хочет видеться под VB.
Компилировал с флагом
build with runtime packages
rtl;vcl;vclx
Моя собственная программа видит и обрабатывает эту библиотеку нормально, а под VB на другой машине - просто пишет, что не может ее найти ( пути правильные ), то есть скорее всего итоговая DLL просто не воспинимается как библиотека.


LIBRARY convert;
uses
Windows, Graphics, JPEG;

Procedure bmp2jpg(bmpname,jpgname : string); Export;

var
JPGpic: TJPEGImage;
BMPpic: TBitmap;
begin
JPGpic := TJPEGImage.Create;
BMPpic := TBitmap.Create;
Try
BMPpic.LoadFromFile(BMPName);
JPGpic.Assign(BMPpic);
JPGpic.SaveToFile(JPGName);
Finally
JPGpic.Free;
BMPpic.Free;
End { Try }
end;

Exports
bmp2jpg index 1 name "bmp2jpg";

end.


СПАСИБО



Алексей Петров   (2001-12-29 14:39) [1]

Дело не в библиотеке.
На "той" машине есть rtl.bpl; vcl.bpl; vclx.bpl?



Андрей Сенченко   (2001-12-29 14:48) [2]

Эти есть. Поставил конечно. Только вот по-моему в недоступной по умолчанию директории.



Юрий Зотов   (2001-12-29 14:52) [3]

Если пути правильные, то видеться DLL должна. Ищите ошибку в коде VB.

А вот написана DLL неверно. Во-первых, передача параметров типа string допускается, если и DLL, и вызывающая программа используют борландовский менеджер памяти. В Вашем случае это невозможно, поэтому строки нужно передавать как PChar (или PWideChar - в общем то, что соответствует строкам VB).

Во-вторых, описатель Export в заголовке прцедуры не нужен (хотя это и не ошибка, просто он устарел). А вот описатель соглашения о вызове просто необходим (потому что по умолчанию будет использован pascal, который VB поддержать явно не сможет). Я плохо знаю VB, но полагаю, что в данном случае нужен описатель safecall (хотя могу и ошибаться, пусть более знающие поправят).



kig   (2001-12-29 15:16) [4]

Только как PChar - VB вызывает DLL (не OLE), конвертируя свои строки из BSTR в LPSTR.

Соглашание о вызове:
If you use Visual C++ (or a similar tool) to create DLLs that will be called by Visual Basic, use the __stdcall calling convention. Do not use the default calling convention (_cdecl).



Андрей Сенченко   (2001-12-29 15:24) [5]

Лезем в HELP

The table below summarizes calling conventions.

Directive Parameter order Clean-up Passes param..
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No

The default register convention is the most efficient, since it usually avoids creation of a stack frame. (Access methods for published properties must use register.) The cdecl convention is useful when you call functions from shared libraries written in C or C++, while stdcall and safecall are recommended, in general, for calls to external code. On Windows, the operating system APIs are stdcall and safecall. Other operating systems generally use cdecl. (Note that stdcall is more efficient than cdecl.)
The safecall convention must be used for declaring dual-interface methods. The pascal convention is maintained for backward compatibility. For more information on calling conventions, see Program control.


Лезем в ссылку Dual Interface... и видим.

A dual interface is an interface that supports both compile-time binding and runtime binding through Automation. Dual interfaces must descend from IDispatch.
All methods of a dual interface (except from those inherited from IInterface and IDispatch) must use the safecall convention, and all method parameter and result types must be automatable. (The automatable types are Byte, Currency, Real, Double, Real48, Integer, Single, Smallint, AnsiString, ShortString, TDateTime, Variant, OleVariant, and WordBool.)


А допустимо ли будет использовать тип PWideChar ?



Андрей Сенченко   (2001-12-29 15:26) [6]

> kig (29.12.01 15:16)

Спасибо. Уже добрался !



kig   (2001-12-29 23:41) [7]

)))То что добрались - это хорошо))

И все же
Dual Interface
Interface
IDispatch
Это все OLE (Automation)

Если бы Вы реализовали свою ф-цию DLL в виде метода OLE-сервера,
Вам но много проще жилось в Васике ))). Вот там - точно - все строки BSTR (PWideChar).




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.014 c
1-52581           ASV                   2001-12-29 00:14  2002.01.17  
PDF Russian fonts


7-52669           Woolen                2001-10-01 13:10  2002.01.17  
Блокирование


4-52692           Ig                    2001-11-17 19:35  2002.01.17  
Поиск файлов


6-52631           kostya                2001-10-22 13:31  2002.01.17  
Поиск MSSQL в локальной сети.


3-52467           Grafr                 2001-12-14 06:25  2002.01.17  
Как искать в поле типа Memo без учета регистра