DLLки из делфи не понемают код Basic'а...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
TuXAPuK
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 5
Зарегистрирован: 02.02.2006 (Чт) 11:59

DLLки из делфи не понемают код Basic'а...

Сообщение TuXAPuK » 02.02.2006 (Чт) 12:26

Здравствуйте господа программисты.... Обращаюсь я к вам вот с такой темой... Я уже года 3 как пишу на делфях и уже даавным давно позабыл ВизуалВайсик (Даже знаки комментов забыл '' :lol: :lol: :oops:). А вот мой хороший знакомый только, только начинает изучать языки програмирования.. И какраз начал с VB...
Вообщем чтобы ему немножко помочь я решил для него переделать кое какие свои DLLки написаные на делфях... Но к сожелению ненак не могу заставить VB посылать Pointer constant в виде параметра.. И библиотека написаная на делфи нечего не понемает... :( А в некоторых случаях VB вообще насмерь зависает, а потом где-то на уровне ядра вылетает в ошибку... :roll: вообщем сбрасываю два проэкта один на VB6.0 (дозвонщик), а другой на Delphi7 (Библиотека)... Кто может помогите пожалусто...
Код: Выделить всё
Private Declare Function asix Lib "c:\program files\borland\delphi7\projects\project1.dll" (ByRef name As String) As String

Private Sub Command1_Click()
Me.Caption = asix("Hello")
End Sub
Код: Выделить всё
library Project1;
{$R *.res}

Uses
  SysUtils, Classes, Windows;


  function asix(name: PChar): PChar; stdcall;
  begin
    MessageBox(0, Name, '/dev/null', 64);
    StrPCopy(Result, 'HelloMan');
  end;

exports
  asix name 'asix';


Begin {..} End.
Вложения
Параметр для DLL.jpg
То что получила DLL'ка =(
Параметр для DLL.jpg (4.17 Кб) Просмотров: 698
Результат от функции.jpg
То что вернулось к VB программе :) :)
Результат от функции.jpg (5.49 Кб) Просмотров: 696

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 02.02.2006 (Чт) 13:03

Код: Выделить всё
Private Declare Function asix Lib "c:\program files\borland\delphi7\projects\project1.dll" (ByRef name As String) As String

Попробуй передавать строку ByVal
Если всё делать своими ручками, они скоро отвалятся !

TuXAPuK
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 5
Зарегистрирован: 02.02.2006 (Чт) 11:59

Сообщение TuXAPuK » 02.02.2006 (Чт) 13:23

Пробывал... Вайсик не поняв ответа от Var параметра зависает насмерть на уровне ядра :( Кстати DLL`ка при передаче ByVar может спокойно всё прочитать...
VB посылает запрос [ asix("Hello") ] --> Делфи читает [ function asix(var name: PChar): PChar; stdcall; ] где name = "Hello", а не раззн билибирда --> далее StrPCopy(name, 'Ok'); StrPCopy(Result, 'HelloMan') --> Вайсик не подаёт не каких признаков жизни (Not Responding) --> Вайси совсем насмерть вылетает на уровне ядра...

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 02.02.2006 (Чт) 13:33

Ну есть вариант, если так не работает, правда он геморрный :roll:
Private Declare Function asix Lib "c:\program files\borland\delphi7\projects\project1.dll" (ByVal name As long) As long
Dim res as long, strret as string
res= asix(strptr("Hi"))

copymemory strret,res,byval lstrlen(res)
А в функции на дельфи получаешь строку по указателю (через CopyMemory,lstrcopy, ну или чем нить внутренним дельфовским) и в результат выдаешь указатель на строку
Если всё делать своими ручками, они скоро отвалятся !

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.02.2006 (Чт) 14:59

Я совсем офигеваю...

TuXAPuK, а чё, функция StrPCopy в дельфи сама выделяет память под копию строки? Или ты её в этот самый dev/null копируешь?
Это первое. И второе - позырь, как принимают и возвращают строки все API, и сделай так же.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

TuXAPuK
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 5
Зарегистрирован: 02.02.2006 (Чт) 11:59

Сообщение TuXAPuK » 02.02.2006 (Чт) 15:14

to Kovu
Нее... попробывал и так тоже самое... один раз из 5 не вылетел но вернул полную чепуху.. Покрайней мере размер нормальным оказался в 5 знаков....

to GSerg
Иррархия для StrPCopy...
Код: Выделить всё
function StrPCopy(Dest: PChar; const Source: string): PChar;
begin
  Result := StrLCopy(Dest, PChar(Source), Length(Source));
end;

Код: Выделить всё
function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar; assembler;
asm
        PUSH    EDI
        PUSH    ESI
        PUSH    EBX
        MOV     ESI,EAX
        MOV     EDI,EDX
        MOV     EBX,ECX
        XOR     AL,AL
        TEST    ECX,ECX
        JZ      @@1
        REPNE   SCASB
        JNE     @@1
        INC     ECX
@@1:    SUB     EBX,ECX
        MOV     EDI,ESI
        MOV     ESI,EDX
        MOV     EDX,EDI
        MOV     ECX,EBX
        SHR     ECX,2
        REP     MOVSD
        MOV     ECX,EBX
        AND     ECX,3
        REP     MOVSB
        STOSB
        MOV     EAX,EDX
        POP     EBX
        POP     ESI
        POP     EDI
end;


Ввывод из проделаной работы
Странно... Вайсик даже для Integer делает здвиг на пол структуры... Может эту у них какая небуть левая политика такая... Чтобы библиотеки написаные под делфёй не шли на ихнем языке...

PS: Хмм... Воот сейчас попробывал на Borland C++ Builder библиотечке зделать... Та же самая херня... :( ... скажите.. а в вайсике нету какой небуть структуры типо Pointer или Pointer->PChar, Pointer->PAnsiChar, Pointer->WideString???

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.02.2006 (Чт) 15:19

Фиговый вывод.

Правильный вывод: ты копируешь строку в никуда.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 02.02.2006 (Чт) 15:27

Код: Выделить всё
  function asix(name: PChar): PChar; stdcall;
  begin
    MessageBox(0, Name, '/dev/null', 64);
    Result = SysAllocStringLen ('HelloMan', lstrlen ('HelloMan');
  end;
---------------------------------------------------------
declare function asix lib...... (ByVal str As String) As String

me.caption = asix ('Hello')


Под строку место сначала выделять надо, прежде чем туда копировать, а то ты в указатель строку пихаешь своим strpcpy

TuXAPuK
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 5
Зарегистрирован: 02.02.2006 (Чт) 11:59

Сообщение TuXAPuK » 02.02.2006 (Чт) 15:42

Нет... Всёравно виснет после обработки билиотеки...

Ладно... А как вайсик например буффер читает?? например как на вайсике прчитать...
function GetWindowsDirectory(lpBuffer: PChar; uSize: UINT): UINT; stdcall;

Есть ведь что-то подобное
Код: Выделить всё
  Function WindirToString: String;
  Var
    Buffer: Array[0..MAXPATH] Of Char;
  Begin
    GetWindowsDirectory(Buffer, SizeOf(Buffer));
    Result := StrPas(Buffer);
  End;

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 02.02.2006 (Чт) 15:53

Код: Выделить всё
    Dim s As String * 256
    GetWindowsDirectory ByVal s, 256
    MsgBox s


P.S.
SysAllocStringLen возвращает указатель на bstr - практически родной для vb тип данных. Из c++ dll такой метод работает на ура. Если у тебя что-то виснет, не в SysAllocStringLen дело. Ищи другие ошибки.
Последний раз редактировалось Юстас 02.02.2006 (Чт) 15:59, всего редактировалось 1 раз.

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 02.02.2006 (Чт) 15:57

Код: Выделить всё
Dim Path As String
Path = Space$(255)
Path = Left$(Path, GetWindowsDirectory(Path, Len(Path)))
MsgBox Path

:roll:
Если всё делать своими ручками, они скоро отвалятся !


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Yandex-бот и гости: 12

    TopList