проблема с dll .....

0 голосов
спросил 30 Окт, 05 от Гость (210,080 баллов) в категории Программные продукты Esri
Добрый вечер!

Возникла проблема при создании dll для ArcView 3.2a,
а точнее при их использовании:

вызываемая функция
     function mydll(s:string):integer; export; stdcall;

avenue
     
myDLL = DLL.Make("D:\temp\ip.dll".AsFileName)
add = DLLProc.Make(myDLL, "mydll", #DLLPROC_TYPE_INT32,     {#DLLPROC_ TYPE_STR})
name = String.MakeBuffer(9)
name = "127.0.0.1"
x = add.Call({name})
MsgBox.Info("Return " + x.asString, "")

проблема в том что, если внутри dll происходят только элементарные матем-е действия,
то всё работает нормально (хотя и не всегда), а если например я пингую другой комп,
то выдаётся segmentation violation! Причём можно и не использовать входной параметр,
а результат тот же.
и вообще ошибка в арквью будет ошибка даже если только создать объект.

да, делаю всё на delphi, и если тестировать эту dll из delphi приложения то всё замечательно работает.

p.s. может кто подскажет особенности написания dll для арквью, потому как на форуме
ничего нового не нашёл.

Спасибо.

6 Ответы

0 голосов
ответил 31 Окт, 05 от Гость (210,080 баллов)
неужели никто не сталкивался ?
уже 18 просмотров и ни одного ответа! :(
не молчите ! :)
0 голосов
ответил 31 Окт, 05 от Гость (210,080 баллов)
http://www.sources.ru/magazine/0804/delphistr.html 5й абз с низа и далее.. Не оно?
0 голосов
ответил 31 Окт, 05 от dindzilin (4,160 баллов)

Есть продположение... при объявлении строкового параметра нельзя использовать тип string, необходимо использовать PChar, поскольку delpiйский string не совсем такой, как было задумано... ну в общем не важно. Короче факт есть факт, проверено! Если не в курсе, то внутри функции можешь объявить дополнительную строковую переменную (а можешь не объявлять%)... хотя к чему слова:

function mydll(s:PChar):integer; export; stdcall;

var 

s1: string;

...

begin

   s1:=String(s);

//Далее делай что хошь

Хмм, только сейчас глянул на верхнюю ссылку, там именно об этом и говорится.

0 голосов
ответил 31 Окт, 05 от Гость (210,080 баллов)
да нет вродеб не из-за этого,(и sharemem я подкл до этого и BORLNDMM.DLL) но интересно, что если
к примеру
var
     mybit:TBitmap;
begin
     mybit:=TBitmap.Create;
...
то всё нормально, а вот если
var
     myping:TIdIcmpClient;
begin
     myping:=TIdIcmpClient.Create(m yping);
...
вот тогда он и выдаёт segmentation violation!
да, и не важно, какого типа параметры я передаю в функцию из dll,
и какой типа на выходе, результат от этого не зависит.
я вот грешу на TIdIcmpClient, может из-за этого, хотя по смыслу не должно бы
0 голосов
ответил 31 Окт, 05 от dindzilin (4,160 баллов)

 myping:=TIdIcmpClient.Create(myping); ??? создаем объект на объекте которого еще не создавали, может так поробуешь, по моему более корректно

 myping:=TIdIcmpClient.Create(Self); // для exeшника

для dll возможно одно из ниже пересчиленного:

myping:=TIdIcmpClient.Create(getmodulehandle(nil));

myping:=TIdIcmpClient.Create(hinstance);

myping:=TIdIcmpClient.Create(0);

myping:=TIdIcmpClient.Create(nil);

кажется так... если что получится свисти, очччень интересно.

0 голосов
ответил 02 Ноя, 05 от Гость (210,080 баллов)
всё решил я проблему! если у кого возникнут вопросы пишите: vavilen@inbox.ru
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...