есть библиотека на дельфи Code: procedure PrintHello(title:pWidechar); begin MessageBox(0, 'Hello', title,MB_OK); end; exports PrintHello; begin end. и есть программа на висуал студио 2008 с таким кодом: Code: typedef void (*ULPRET)(LPSTR); ULPRET DLLProc; HINSTANCE hDll; hDll=LoadLibrary("Project1.dll"); DLLProc=(ULPRET)GetProcAddress(hDll, "PrintHello"); char sz[]="text title"; (*DLLProc)((LPSTR) sz); FreeLibrary(hDll); при вызове в messagebox не отображается заголовок. В чем ошибка?
Соглашения вызовов не совпадают. Сишка по умолчанию использует cdecl, а дельфи - pascal или fdastcall. Нужно либо в длл, либо в вызывающей программе указать соглашение вызова правильное. Либо и там и там одинаковое указать, stdcall например.
GRRRL Power Исправил на procedure PrintHello(titleWidechar);stdcall; и typedef void (_stdcall *ULPRET)(LPSTR); Проблема такая же: вместо текста сообщения каша.
То что функция в дельфи принимает строку в unicode, а из сишника вызывается с передачей строки в ansii, тоже не очень хорошо.
ставьте точеку останова внутри длл и запускайте под отладчиком прогу которая грузит эту длл отладчик остановится внутри длл и пошагово сможете прогнать вывод message box'а
GhostOnline, под этими двумя фразами я имел ввиду одно и тоже. Например, передаем строку eeeee, а в заголовке отображается [][]e[][] С pwidechar & pchar эксперементировал, разницы нет.
Отображаются "кракозябры" и совсем не отображается - большая разница. В какой версии дельфи скомпилирована dll? Имей ввиду что в версиях от 2009 PChar эквивалетен PWideChar, а раньше PAnsiChar. http://stackoverflow.com/questions/3949046/passing-pchar-char-between-c-and-delphi-dll
procedure PrintHello(titleAnsiChar); stdcall; begin MessageBox(0, 'Hello', pchar(title),MB_OK); end; Сделал так. Теперь ошибка в программе на Си. Вылетаем со словами: UPD. А если так: procedure PrintHello(titleAnsiChar); begin MessageBox(0, 'Hello', pchar(title),MB_OK); end; то без ошибки, но результат тот же- в title кракозяблы
зачем stdcall убрал? // туплю забыл что объявление и имплементация в дельфи отдельно ну вообще пробуй char*, и выделять на байт больше чем надо, и ставить последний байт в ноль. То есть если нужно передать "lol" то по факту передавай "lol\0" а в dll пробуй PAnsiChar или AnsiString, в общем экспериментируй, у меня нет ни того ни другого компилятора, проверить не могу
Смотрите условие Дан текстовый файл (файл состоящий из строк) F, содержащий программу на языке С. Проверить эту программу на несоответствие числа открывающихся и закрывающихся круглых скобок. Code: void main() { SetConsoleOutputCP(1251); FILE *file; file = fopen("test.txt", "r"); int i=0, r=0, o=0; char k[999], *result; /* do { r=fgetc(file); if(r==40) i++; else if(r==41) i--; } while(!feof(file)); if(i==0) cout<<"Количество открывающихся и закрывающихся скобок одинаково"<<endl; else cout<<"Количество открывающихся и закрывающихся скобок неравно"<<endl; }*/ do { result=fgets(k,999, file); r=strlen(k); for(i=0;i<r;i++) { cout<<k[i]; if(k[i]==40) o++; else if(k[i]==41) o--; } } while(!feof(file)); if(o==0) cout<<"Количество открывающихся и закрывающихся скобок одинаково"<<endl; else cout<<"Количество открывающихся и закрывающихся скобок неравно"<<endl; }
да, это ахтунг, когда переменные называют o или l. RaTeN, рекомендую почитать Роберта Мартина "Чистый Код".