Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
AndyM Гость
|
Добавлено: Пт Апр 18 2003 09:28 Заголовок сообщения: Помогите с DLL... |
|
|
Скачал файлик http://progcpp.narod.ru/zip/propis.arj, Си-шная библиотека, возвращает число прописью. Пробую подцепить эту библу из Бейсика, возвращает всегда 0... В исходном тексте в экспортирующей функции убрал все, что возможно, оставил return "aaaa", выглядит теперь так: _declspec(dllexport) LPCTSTR CALLBACK Propis(double InDouble) { MessageBox(NULL,"ghbbbbb","Function from DLL",MB_OK); return "aaaaaaaaaaaa"; } Messagebox работает, но все равно возврат 0. Плиз, подскажите, чего там не хватает?! |
|
Вернуться к началу |
|
|
Борис Гость
|
Добавлено: Пт Апр 18 2003 13:27 Заголовок сообщения: Строки в/из бейсика нужно передавать ByRef-аргументом (+) |
|
|
Твой
>> return "aaaaaaaaaaaa";
возвращает не "aaaaaaaaaaaa", а адрес начала строки "aaaaaaaaaaaa" в теле функции, преобразованный компилятором к типу _declspec(dllexport) LPCTSTR CALLBACK
Учите матчасть, господа |
|
Вернуться к началу |
|
|
AndyM Гость
|
Добавлено: Сб Апр 19 2003 08:51 Заголовок сообщения: Ты пальцем покажи :-))... Я на Си не пишу..(+) |
|
|
Да хоть двадцать раз ByRef! Мне нужно возвратить строку! Уверен, что изменения в Си-шном коде самые минимальные нужно сделать! Чтобы вызов из Бейсик выглядел самым обычным образом: Private Declare Function Propis Lib "propis.dll" (InDouble As Double) MyString=Propis(1234) или так Private Declare Function Propis Lib "propis.dll" (InDouble As Double,MyString as String) Call Propis(1234,MyString) А параметры по умолчанию и так по ссылке... |
|
Вернуться к началу |
|
|
Борис Гость
|
Добавлено: Пн Апр 21 2003 13:32 Заголовок сообщения: Re: _Iooo |
|
|
Твой второй вариант
>>Private Declare Sub Propis Lib "propis.dll" (ByVal InDouble As Double, ByRef MyString as String) MyString = Space(500) >>Call Propis(1234,MyString)
верный (с добавлением строчки MyString = Space(500) перед вызовом функции). Теперь функция на C++:
void Propis(double d, char* s) { //...................... //.... заполнение s .... //...................... // строка MyString = Space(500) в коде // бейсика нужна, чтобы s указывал // на уже выделенное место для результата, // то есть чтобы C++-программа не выделяла // сама память под результат, а только // производила расчет, иначе может // возникнуть типичное для виндов // сообщение о недопустимой операции //...................... return; } |
|
Вернуться к началу |
|
|
|