Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Форма ввода логина/пароля (CredUIPromptForWindowsCredentials + CredPackAuthenticationBuffer)
 
Доброго времени суток. Пишу форму запроса логина/пароля в VBA, никак не могу вывести форму с предварительно заполненным именем пользователя. Подскажите, пожалуйста, что не так, что забыл
Код
Option Explicit
 
#If VBA7 Then
    Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Declare PtrSafe Function CredUIPromptForWindowsCredentials Lib "credui" Alias "CredUIPromptForWindowsCredentialsW" (ByRef pUiInfo As CREDUI_INFO, ByVal dwAuthError As Long, ByRef pulAuthPackage As LongPtr, ByRef pvInAuthBuffer As Any, ByVal ulInAuthBufferSize As Long, ByRef ppvOutAuthBuffer As Any, pulOutAuthBufferSize As Long, ByRef iSave As Long, ByVal dwFlags As Long) As Long
    Private Declare PtrSafe Function CredUnPackAuthenticationBuffer Lib "credui" Alias "CredUnPackAuthenticationBufferW" (ByVal dwFlags As Long, ByVal pAuthBuffer As LongPtr, ByVal cbAuthBuffer As Long, ByVal pszUserName As LongPtr, ByRef pcchMaxUserName As Long, ByVal pszDomainName As LongPtr, ByRef pcchMaxDomainName As Long, ByVal pszPassword As LongPtr, ByRef pcchMaxPassword As Long) As Long
    Private Declare PtrSafe Function CredPackAuthenticationBuffer Lib "credui" Alias "CredPackAuthenticationBufferA" (ByVal dwFlags As Long, ByRef pszUserName As Any, ByRef pszPassword As Any, ByRef pPackedCredentials As Any, ByRef pcbPackedCredentials As Long) As Long
#Else
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Declare Function CredUIPromptForWindowsCredentials Lib "CredUI" Alias "CredUIPromptForWindowsCredentialsW" (ByRef pUiInfo As CREDUI_INFO, ByVal dwAuthError As Long, ByRef pulAuthPackage As Long, ByVal pvInAuthBuffer As Any, ByVal ulInAuthBufferSize As Long, ByRef ppvOutAuthBuffer As Any, pulOutAuthBufferSize As Long, ByRef iSave As Long, ByVal dwFlags As Long) As Long
    Private Declare Function CredUnPackAuthenticationBuffer Lib "CredUI" Alias "CredUnPackAuthenticationBufferW" (ByVal dwFlags As Long, ByVal pAuthBuffer As Long, ByVal cbAuthBuffer As Long, ByVal pszUserName As Long, ByRef pcchMaxUserName As Long, ByVal pszDomainName As Long, ByRef pcchMaxDomainName As Long, ByVal pszPassword As Long, ByRef pcchMaxPassword As Long) As Long
    Private Declare Function CredPackAuthenticationBuffer Lib "credui" Alias "CredPackAuthenticationBufferW" (ByVal dwFlags As Long, ByRef pszUserName As Any, ByRef pszPassword As Any, ByRef pPackedCredentials As Any, ByRef pcbPackedCredentials As Long) As Long
#End If
Private Type CREDUI_INFO
    cbSize As Long
    #If VBA7 Then
        hwndParent As LongPtr
        pszMessageText As LongPtr
        pszCaptionText As LongPtr
    #Else
        hwndParent As Long
        pszMessageText As Long
        pszCaptionText As Long
    #End If
    hbmBanner As Long
End Type
 
Public Sub GetCred()
    
    Dim pUiInfo As CREDUI_INFO
    
    Dim pulOutAuthBufferSize As Long
    Dim pulInAuthBufferSize As Long
    
    #If VBA7 Then
        Dim ppvOutAuthBuffer As LongPtr
        Dim ppvInAuthBuffer As LongPtr
    #Else
        Dim ppvOutAuthBuffer As Long
        Dim ppvInAuthBuffer As Long
    #End If
    
    
    Dim ret&, b() As Byte, InAuthBuffer() As Byte
    Dim s1$, s2$
    pUiInfo.cbSize = LenB(pUiInfo)
    pUiInfo.hwndParent = 0
    
    s1 = "Необходимо ввести учетные данные"
    s2 = "Подключение"
    pUiInfo.pszMessageText = StrPtr(s1)
    pUiInfo.pszCaptionText = StrPtr(s2)
    
    ret = CredPackAuthenticationBuffer(4, sUserName, vbNullString, Empty, pulInAuthBufferSize)
    ReDim InAuthBuffer(pulInAuthBufferSize)
    ret = CredPackAuthenticationBuffer(4, sUserName, vbNullString, InAuthBuffer(0), pulInAuthBufferSize)
    ret = CredUIPromptForWindowsCredentials(pUiInfo, Empty, Empty, InAuthBuffer(0), pulInAuthBufferSize, ppvOutAuthBuffer, pulOutAuthBufferSize, Empty, &H20 Or &H200)
    
    If ret = 0 Then
        'CredUnPackAuthenticationBuffer
    End If
End Sub

Кросс
PQ. Функция Content.Uri. Возможно ли получить ее определение?
 
Здравствуйте.
Вопрос, собственно, в сабже
Ноги растут отсюда
Код
let
    FromFile = Web.Contents("file:///J:/Laragon/www/ferre.xml"),
    FromWeb = ()=>Value.Metadata(Web.Contents("http://localhost/ferre.xml"))[Content.Uri],
    Check1 = (Web.Page(FromFile){0}[Data]                                                   /*так грузится только xml*/),
    Check2 = (Web.Page(Value.RemoveMetadata(FromFile) meta [Content.Uri=FromWeb()]){0}[Data]/*так грузится html,сформированный xslt,*/
                                                                                 /*но по ссылке из FromWeb, бинарник из */
                                                                                 /*FromFile игнорируется*/)
in
    Check2
Power Query. Путь к текущей книге, выбор папок из диалогового окна, ввод значений через InputBox
 
Всем доброго времени суток.
Пока не спится, чтоб чем-то себя занять, написал наброски 3х функций
Вдруг кому-нибудь пригодятся :)
Для работы должен быть включен параметр "Использование элементов управления ActiveX, не помеченных как безопасные для использования" в параметрах безопасности IE

Код
let
    InputBox = (Prompt,optional Caption as nullable text,optional Default as nullable any,optional Type as nullable number)=>
        Web.Page("<script>
            try {
                var xlapp = GetObject('','Excel.Application');
                var ret=xlapp.InputBox('"&Prompt&"','"&(if Caption=null then "null" else Text.From(Caption))&"','"&
                    (if Default=null then "null" else Text.From(Default))&"',null,null,null,null,"&
                    (if Type=null then "null" else Text.From(Type))&")
            } catch (e){
                var err=(e.message)
            } 
            document.write('<table><tr><th>ret</th></tr><tr><td>'+(typeof err!=='undefined'?err:ret)+'</td></tr></table>')
        </script>"){0}[Data][ret]{0},
    SelectFolder = (InitialFileName,Title) => 
        Web.Page("<script>
            try{
                var dlg=GetObject('','Excel.Application').FileDialog(4);
                dlg.title='"&Title&"';
                dlg.InitialFileName='"&Text.Replace(InitialFileName,"\","\\")&"';
                var ret=(dlg.show()==-1?dlg.selecteditems.item(1):'')
            } catch (e){
                var err=(e.message)
            } 
            document.write('<table><tr><th>ret</th></tr><tr><td>'+(typeof err!=='undefined'?err:ret)+'</td></tr></table>')
        </script>"){0}[Data][ret]{0},
    ThisWBPath  = Web.Page("<script>
            try{
                var xlapp = GetObject('','Excel.Application');
                var ret=xlapp.activeworkbook.fullname
            } catch (e){
                var err=(e.message)
            }
            document.write('<table><tr><th>ret</th></tr><tr><td>'+(typeof err!=='undefined'?err:ret)+'</td></tr></table>')
        </script>"){0}[Data][ret]{0},
    Path = if try Number.From(InputBox("Введите значение параметра X","Запрос1 - Ввод параметра X",0,1))>0 otherwise false then SelectFolder("C:\","Выберите папку") else ThisWBPath
in
    Path
Изменено: Андрей Лящук - 04.10.2019 04:30:14
Страницы: 1
Наверх