Credwrite возвращает код ошибки Win32 (error_invalid_function) «Неправильная функция».
Вопрос
Я пытаюсь позвонить Credwrite, но он возвращается Error_invalid_function. Анкет я могу позвонить Credread Чтобы получить учетные данные из магазина паролей, и я могу хранить новые учетные данные, используя Cerruipromptforcredentials.
Но я не могу понять, как заставить Credwrite работать.
Код, который я использую,:
var
Target, Username, Password: WideString;
begin
Target := 'StackOverflowSomething';
Username := 'IanBoyd';
Password := 'password69';
ZeroMemory(@Credentials, SizeOf(Credentials));
Credentials.TargetName := PWideChar(Target);
Credentials.Type_ := CRED_TYPE_GENERIC;
Credentials.UserName := PWideChar(Username);
Credentials.Persist := CRED_PERSIST_ENTERPRISE;
Credentials.CredentialBlob := PByte(Password);
Credentials.CredentialBlobSize := 2*(Length(Password));
Credentials.UserName := PWideChar(Username);
if not CredWriteW(@Credentials, 0) then
RaiseLastWin32Error;
И getlasterror возвращается 1 (ERROR_INVALID_FUNCTION
)
Эта функция неверна? Это даже не возвращается ERROR_INVALID_PARAMETER
, это возвращает «неверную функцию». Что неверно?
Есть ли пример кода, который вызывает credwrite?
Заметки
- Я пытался позвонить версии ANSI (credwritea), тот же результат
- Я пытался использовать
CRED_PERSIST_SESSION
а такжеCRED_PERSIST_LOCAL_MACHINE
, в дополнение кCRED_PERSIST_ENTERPRISE
Решение
Неважно, я понял это.
И это не вина вызова API или мои параметры.
Я просто глуп.
И я хочу дуться, не сказав то, что я сделал :(
Другие советы
Это очень старый, очень известная проблема с очень старой и довольно известной работой вокруг, чтобы избежать кэширования отдельных ссылок во вспышке.Вы просто добавляете мусор на конец URL с каждым вызовом.Например:
myUrlLoader.load(new URLRequest("http://sameOldSite.com/sameOldfile.mp3?" + new Date().toString() ));
.
Этот код непроверен, так что это может быть не точна, но вы получаете идею.Применив новую дату, вы получаете уникальную строку символов каждый раз, когда вы создаете новую дату () или перерабатываете один объект даты и продолжаете вызывать TOSTRING () или GetTime () или что угодно.Вы можете сделать то же самое с глобальным объектом таймера, я тоже полагаю.Эта строка дополнительного мусора отбрасывается, потому что она рассматривается как получаемая переменная и не используется.
Мне любопытно, это для смарт -карты, верно? И вы храните PIN -код NO для смарт -карты, возможно, вложение/драйвер не загружается для работы CredWrite? Возможно, со стандартным определенным аппаратным/программным обеспечением/программным обеспечением SmartCard, используемым Windows, будет активировать функцию credwrite, я предполагаю, что Credwrite пытается общаться с чем -то с чем -то (возможно, общий вызов API к стандартной функции в оборудовании SmartCard?) ... Просто ... просто ... просто ... просто ... просто ... просто мои мысли...
Надеюсь, это поможет, с уважением, Том.