Есть dll-ка у которой один параметр — он входной-выходной. Т.е. я передаю ей строку предположим
qwerty а она(dll) добавляет к ней hello. Так вот подскажите пожалуйста как я могу получить обратно в бейсик строку qwertyhello? Dll я делаю, так что если подскажите технологию в целом, то я пойму. Спасибо!
Здравствуйте, Ген Геныч, Вы писали:
ГГ>Есть dll-ка у которой один параметр — он входной-выходной. Т.е. я передаю ей строку предположим
ГГ>qwerty а она(dll) добавляет к ней hello. Так вот подскажите пожалуйста как я могу получить обратно в бейсик строку qwertyhello? Dll я делаю, так что если подскажите технологию в целом, то я пойму. Спасибо!
Declare Function fName Lib "MyLib" (ByRef myString) as someType
В общем передаешь по ссылке а не по значению
Здравствуйте, Ген! Вы писали:
ГГ> Есть dll-ка у которой один параметр — он входной-выходной. Т.е. я
ГГ> передаю ей строку предположим qwerty а она(dll) добавляет к ней hello.
ГГ> Так вот подскажите пожалуйста как я могу получить обратно в бейсик
ГГ> строку qwertyhello? Dll я делаю, так что если подскажите технологию в
ГГ> целом, то я пойму. Спасибо!
Пишем в VB
Private Declare Sub AddHello Lib "mylib.dll" (ByVal lpString As String)
...
Private Sub Button1_Click
Dim buff As String * 255 ' выделяем достаточный буфер
buff = "привет" & Chr(0) ' завершаем строку нулем (в С нужна null-terminated string)
AddHello buff
MsgBox buff
End Sub
Пишем в VC++
void __stdcall AddHello (LPSTR text)
{
strcat(text," мир");
}
И не забываем экспортировать ф-ю (см. DEF файлы)
Можно и без ноликов обойтись но тогда сишная ф-я должна сама определять реальный размер строки, что в общем случае невозможно. Или ты сам должен в нее этот размер передавать.
Posted via RSDN NNTP Server 1.7 beta
Здравствуйте, Ген Геныч, Вы писали:
ГГ>Есть dll-ка у которой один параметр — он входной-выходной. Т.е. я передаю ей строку предположим
ГГ>qwerty а она(dll) добавляет к ней hello. Так вот подскажите пожалуйста как я могу получить обратно в бейсик строку qwertyhello? ГГ>Dll я делаю, так что если подскажите технологию в целом, то я пойму. Спасибо!
Пример из MSDN (статья "Using dlls from Visual Basic"):
The following C-language code copies some number of characters from one BSTR into another. Notice that this example tests the second BSTR to see if it is already assigned. If it is, the example uses the SysFreeString function to free the existing string before replacing it.
short __declspec(dllexport) StringArgs(BSTR *pbstrArg1, BSTR *pbstrArg2, int cch)
{
// return error code if requested characters
// less than zero, or input string is unassigned
// or has too few characters
if (cch < 0 || *pbstrArg1 == NULL || (int)SysStringByteLen(*pbstrArg1) < cch)
return -1;
if (*pbstrArg2 != NULL) { // argument string is already assigned;
// we must free before allocating
SysFreeString(*pbstrArg2);
}
if ((*pbstrArg2 = SysAllocStringByteLen((char *)*pbstrArg1, cch))== NULL)
return -2;
return 0;
}
This Visual Basic code declares and calls the StringArgs function:
Declare Function StringArgs Lib "advdll32" (inpStr As String, outStr As String, _
ByVal n As Integer) As Integer
Sub StringArgsTest()
Dim newStr As String
x = StringArgs("abracadabra", newStr, 5)
MsgBox x & ":" & newStr
End Sub