Asked by:
BC30109_'String' is a class type and cannot be used as an expression.

Question
-
I haven't used cryptography much since a 2007 ISYS1005 Access VBA Lab. I am familiar with basic cryptography. I have two texts by Chapman and Bonde. We used some of each in lab. My old laptop went through a wet outlet and a basement flood. My two week cram class of an EHR was ruined. I understand concept of AES->HMAC->RSA etc., but want to get through both texts as refreshers and basically create web forms instead of succumbing to ASP, MVC, etc. Seems Chapman's text is a previous version of the Visual Basic IDE within Visual Studio 2019. I easily changed the While->Wend to While->End While, but seems the IDE is asking a function as a string with sNameBuffer = String(lNameLength, vbNullChar) . Any help would be appreciated.
Private Sub EnumCSPs()
Dim lResult As Long
Dim lIndex As Long
Dim sNameBuffer As String
Dim lNameLength As Long
Dim lProvType As LonglIndex = 0
lblList.Text = ""lResult = CryptEnumProviders(lIndex, 0, 0, lProvType, vbNullString, lNameLength)
sNameBuffer = String(lNameLength, vbNullChar) //BC30109 'String' is a class type and cannot be used as an expression.
While CBool(CryptEnumProviders(lIndex, 0, 0, lProvType, sNameBuffer,
lNameLength))
If (lIndex > 0) Then lblList.Text = lblList.Text + vbCrLf
lblList.Text = lblList.Text + sNameBuffer
lIndex = lIndex + 1
lResult = CryptEnumProviders(lIndex, 0, 0, lProvType, vbNullString, lNameLength)
sNameBuffer = String(lNameLength, vbNullChar)
End WhileEnd Sub
- Moved by Julie Xu-MSFTMicrosoft contingent staff Thursday, December 19, 2019 1:22 AM VB6
Thursday, December 12, 2019 10:09 PM
All replies
-
Hi
Maybe this. It creates a string buffer of the length of the 1NameLength value (I used 12345678 for testing)
Dim lNameLength As Long = 12345678 Dim sNameBuffer As String = StrDup(CInt(lNameLength), vbNullChar) Dim len As Integer = sNameBuffer.Length ' provides a string buffer of 12345678
Regards Les, Livingston, Scotland
Thursday, December 12, 2019 10:26 PM -
Perhaps if I include the entire text example. Generally the Cint recommendation fixed the errors, but I started getting warning flags and debugging errors while using the buttons. Seems: Wend to End While and the label to label.Text instead of label.caption. The string error though. I've never had an issue with using certain cryptography in Windows10 from text examples, but I like the project of eventually getting back to a file on the C:drive of a SHA2 or similar with something neat like changing a table Matrix to show a red X instead of any M if a different or base file is used.
It's a form with three buttons and a label. I'm assuming the exercise is for showing which SHA, DES, MD5;2,etc., are on the computer.
'VERSION 5.00
'Begin VB.Form frmCSPs
'...Public Class Form1 with 3 buttons and a label'//////////////////////////////////////////////////////////////////////////////////
Option Explicit
'Public Class...form1_load(...
Private Declare Function CryptEnumProviderTypes Lib "advapi32.dll" Alias "CryptEnumProviderTypesA" ( _
ByVal dwIndex As Long, _
ByVal pdwReserved As Long, _
ByVal dwFlags As Long, _
pdwProvType As Long, _
ByVal pszTypeName As String, _
pcbTypeName As Long) As LongPrivate Declare Function CryptEnumProviders Lib "advapi32.dll" Alias "CryptEnumProvidersA" ( _
ByVal dwIndex As Long, _
ByVal pdwReserved As Long, _
ByVal dwFlags As Long, _
pdwProvType As Long, _
ByVal pszProvName As String, _
pcbProvName As Long) As LongPrivate Sub cmdlistCSPs_Click(sender As Object, e As EventArgs) Handles cmdlistCSPs.Click
EnumCSPs()
End SubPrivate Sub cmdTypes_Click(sender As Object, e As EventArgs) Handles cmdTypes.Click
EnumTypes()
End SubPrivate Sub cmdExit_Click(sender As Object, e As EventArgs) Handles cmdExit.Click
Me.Close()
End SubPrivate Sub EnumCSPs()
'*************************************************************
'* Written By: Davis Chapman
'* Date: September 22, 1999
'*
'* Syntax: EnumCSPs
'*
'* Parameters: None
'*
'* Purpose: This subroutine loops through all of the CSPs
'* installed on the system, listing them for the user.
'*************************************************************
Dim lResult As Long
Dim lIndex As Long
Dim sNameBuffer As String
Dim lNameLength As Long
Dim lProvType As Long
'--- Initialize the necessary variables
lIndex = 0
lblList.Caption = ""
'--- Determine the size of the buffer needed
lResult = CryptEnumProviders(lIndex, 0, 0, lProvType, vbNullString, lNameLength)
'--- Prepare a string buffer for the CryptEncrypt function
sNameBuffer = String(lNameLength, vbNullChar)
'--- Get the provider name, looping until all providers have been listed
While CBool(CryptEnumProviders(lIndex, 0, 0, lProvType, sNameBuffer, _
lNameLength))
'--- Add the current CSP to the display list
If (lIndex > 0) Then lblList.Caption = lblList.Caption + vbCrLf
lblList.Caption = lblList.Caption + sNameBuffer
'--- Increment the index counter
lIndex = lIndex + 1
'--- Determine the size of the buffer needed
lResult = CryptEnumProviders(lIndex, 0, 0, lProvType, vbNullString, lNameLength)
'--- Prepare a string buffer for the CryptEncrypt function
sNameBuffer = String(lNameLength, vbNullChar)
Wend
End SubPrivate Sub EnumTypes()
'*************************************************************
'* Written By: Davis Chapman
'* Date: September 22, 1999
'*
'* Syntax: EnumTypes
'*
'* Parameters: None
'*
'* Purpose: This subroutine loops through all of the CSP types
'* installed on the system, listing them for the user.
'*************************************************************
Dim lResult As Long
Dim lIndex As Long
Dim sNameBuffer As String
Dim lNameLength As Long
Dim lProvType As Long
'--- Initialize the necessary variables
lIndex = 0
lblList.Caption = ""
'--- Determine the size of the buffer needed
lResult = CryptEnumProviderTypes(lIndex, 0, 0, lProvType, vbNullString, lNameLength)
'--- Prepare a string buffer for the CryptEncrypt function
sNameBuffer = String(lNameLength, vbNullChar)
'--- Get the type name, looping until all types have been listed
While CBool(CryptEnumProviderTypes(lIndex, 0, 0, lProvType, sNameBuffer, _
lNameLength))
'--- Add the current CSP to the display list
If (lIndex > 0) Then lblList.Caption = lblList.Caption + vbCrLf
lblList.Caption = lblList.Caption + sNameBuffer
'--- Increment the index counter
lIndex = lIndex + 1
'--- Determine the size of the buffer needed
lResult = CryptEnumProviderTypes(lIndex, 0, 0, lProvType, vbNullString, lNameLength)
'--- Prepare a string buffer for the CryptEncrypt function
sNameBuffer = String(lNameLength, vbNullChar)
Wend
End Sub'End Class
Friday, December 13, 2019 12:20 AM -
but seems the IDE is asking a function as a string with sNameBuffer = String(lNameLength, vbNullChar) . Any help
"String" is a .NET class:
String Class
https://docs.microsoft.com/en-us/dotnet/api/system.string?view=netframework-4.8
The expression: String(lNameLength, vbNullChar)
has the syntax of a Function call.
It is not a correct syntax for constructing a String, if that is what was
intended. If the program has a Function named "String" defined then that
name should be changed, or qualified so that it can be distinguished from
System.String.
<typename>' is a class type and cannot be used as an expression
https://docs.microsoft.com/en-us/dotnet/visual-basic/misc/bc30109
- Wayne
Friday, December 13, 2019 12:36 AM -
Perhaps if I include the entire text example. Generally the Cint recommendation fixed the errors, but I started getting warning flags and debugging errors while using the buttons. Seems: Wend to End While and the label to label.Text instead of label.caption. The string error though. I've never had an issue with using certain cryptography in Windows10 from text examples, but I like the project of eventually getting back to a file on the C:drive of a SHA2 or similar with something neat like changing a table Matrix to show a red X instead of any M if a different or base file is used.
It's a form with three buttons and a label. I'm assuming the exercise is for showing which SHA, DES, MD5;2,etc., are on the computer.
'VERSION 5.00
'Begin VB.Form frmCSPs
'...Public Class Form1 with 3 buttons and a label'//////////////////////////////////////////////////////////////////////////////////
Option Explicit
'Public Class...form1_load(...
Private Declare Function CryptEnumProviderTypes Lib "advapi32.dll" Alias "CryptEnumProviderTypesA" ( _
ByVal dwIndex As Long, _
ByVal pdwReserved As Long, _
ByVal dwFlags As Long, _
pdwProvType As Long, _
ByVal pszTypeName As String, _
pcbTypeName As Long) As LongPrivate Declare Function CryptEnumProviders Lib "advapi32.dll" Alias "CryptEnumProvidersA" ( _
ByVal dwIndex As Long, _
ByVal pdwReserved As Long, _
ByVal dwFlags As Long, _
pdwProvType As Long, _
ByVal pszProvName As String, _
pcbProvName As Long) As LongPrivate Sub cmdlistCSPs_Click(sender As Object, e As EventArgs) Handles cmdlistCSPs.Click
EnumCSPs()
End SubPrivate Sub cmdTypes_Click(sender As Object, e As EventArgs) Handles cmdTypes.Click
EnumTypes()
End SubPrivate Sub cmdExit_Click(sender As Object, e As EventArgs) Handles cmdExit.Click
Me.Close()
End SubPrivate Sub EnumCSPs()
'*************************************************************
'* Written By: Davis Chapman
'* Date: September 22, 1999
'*
'* Syntax: EnumCSPs
'*
'* Parameters: None
'*
'* Purpose: This subroutine loops through all of the CSPs
'* installed on the system, listing them for the user.
'*************************************************************
Dim lResult As Long
Dim lIndex As Long
Dim sNameBuffer As String
Dim lNameLength As Long
Dim lProvType As Long
'--- Initialize the necessary variables
lIndex = 0
lblList.Caption = ""
'--- Determine the size of the buffer needed
lResult = CryptEnumProviders(lIndex, 0, 0, lProvType, vbNullString, lNameLength)
'--- Prepare a string buffer for the CryptEncrypt function
sNameBuffer = String(lNameLength, vbNullChar)
'--- Get the provider name, looping until all providers have been listed
While CBool(CryptEnumProviders(lIndex, 0, 0, lProvType, sNameBuffer, _
lNameLength))
'--- Add the current CSP to the display list
If (lIndex > 0) Then lblList.Caption = lblList.Caption + vbCrLf
lblList.Caption = lblList.Caption + sNameBuffer
'--- Increment the index counter
lIndex = lIndex + 1
'--- Determine the size of the buffer needed
lResult = CryptEnumProviders(lIndex, 0, 0, lProvType, vbNullString, lNameLength)
'--- Prepare a string buffer for the CryptEncrypt function
sNameBuffer = String(lNameLength, vbNullChar)
Wend
End SubPrivate Sub EnumTypes()
'*************************************************************
'* Written By: Davis Chapman
'* Date: September 22, 1999
'*
'* Syntax: EnumTypes
'*
'* Parameters: None
'*
'* Purpose: This subroutine loops through all of the CSP types
'* installed on the system, listing them for the user.
'*************************************************************
Dim lResult As Long
Dim lIndex As Long
Dim sNameBuffer As String
Dim lNameLength As Long
Dim lProvType As Long
'--- Initialize the necessary variables
lIndex = 0
lblList.Caption = ""
'--- Determine the size of the buffer needed
lResult = CryptEnumProviderTypes(lIndex, 0, 0, lProvType, vbNullString, lNameLength)
'--- Prepare a string buffer for the CryptEncrypt function
sNameBuffer = String(lNameLength, vbNullChar)
'--- Get the type name, looping until all types have been listed
While CBool(CryptEnumProviderTypes(lIndex, 0, 0, lProvType, sNameBuffer, _
lNameLength))
'--- Add the current CSP to the display list
If (lIndex > 0) Then lblList.Caption = lblList.Caption + vbCrLf
lblList.Caption = lblList.Caption + sNameBuffer
'--- Increment the index counter
lIndex = lIndex + 1
'--- Determine the size of the buffer needed
lResult = CryptEnumProviderTypes(lIndex, 0, 0, lProvType, vbNullString, lNameLength)
'--- Prepare a string buffer for the CryptEncrypt function
sNameBuffer = String(lNameLength, vbNullChar)
Wend
End Sub'End Class
This is not VB.NET code at all. If you want to use VB.NET you best option is to start with a clean slate. If this is for VB Classic then go to the following link for VB Classic
http://www.vbforums.com/forumdisplay.php?1-Visual-Basic-6-and-Earlier
When coding in VB.NET its best to forget old ways of coding and learn new ways to code.
Please remember to mark the replies as answers if they help and unmarked them if they provide no help, this will help others who are looking for solutions to the same or similar problem. Contact via my Twitter (Karen Payne) or Facebook (Karen Payne) via my MSDN profile but will not answer coding question on either.
NuGet BaseConnectionLibrary for database connections.
Friday, December 13, 2019 12:39 AM -
Hi
To make the code more readable, please use the code block tool.
Regards Les, Livingston, Scotland
Friday, December 13, 2019 12:41 AM -
sNameBuffer = String(lNameLength, vbNullChar) .
equivalent of vb 6 string
https://social.msdn.microsoft.com/Forums/en-US/45721253-d8f3-42fc-933c-5343531f9fcc/equivalent-of-vb-6-string
- Wayne
Friday, December 13, 2019 12:48 AM -
The Chapman text wasn't clear beyond Visual Basic applications. Messing around it seems Windows10 has simple3des, SHA1 and RSA. Somewhere around New Filestream is a little abstract, but I'm not even at form headers yet. Windows Forms (Visual Basic, .NET) is what I usually select in Visual Studio. Basically learning Visual Basic from a VBA transition. We had our Access files basically like MVC, but VBA.
It encrypts and gives a message box with a signature(1form,1button), but close to the general project:
Imports System.Security.Cryptography Imports System.IO Public Class Dashboard Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim plainText As String = InputBox("Text to Encrypt:") Dim password As String = InputBox("Enter a Password:") Dim wrapper As New Simple3Des(password) Dim cipherText As String = wrapper.EncryptData(plainText) 'MsgBox("The cipher text is: " & cipherText) My.Computer.FileSystem.WriteAllText( My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\cipherText.txt", cipherText, False) Dim password1 As String = "Password" 'Create Password Key Dim SaltValueBytes As Byte() = System.Text.Encoding.ASCII.GetBytes("This is my salt") Dim passwordKey As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(password1, SaltValueBytes) Dim alg As RijndaelManaged = New RijndaelManaged alg.Key = passwordKey.GetBytes(alg.KeySize / 8) alg.IV = passwordKey.GetBytes(alg.BlockSize / 8) 'Read the unencrypted file into filedata Dim inFile As FileStream = New FileStream(My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\cipherText.txt", FileMode.Open, FileAccess.Read) Dim fileData(inFile.Length) As Byte inFile.Read(fileData, 0, CType(inFile.Length, Integer)) 'Create the ICryptoTransform and CryptoStream object Dim encryptor As ICryptoTransform = alg.CreateEncryptor inFile.Close() Dim outFile As FileStream = New FileStream(My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\cipherText.txt", FileMode.OpenOrCreate, FileAccess.Write) Dim encryptStream As CryptoStream = New CryptoStream(outFile, encryptor, CryptoStreamMode.Write) 'Write contents to the CryptoStream encryptStream.Write(fileData, 0, fileData.Length) 'Close the file handles encryptStream.Close() outFile.Close() Dim signer As RSACryptoServiceProvider = New RSACryptoServiceProvider 'step 2 Dim file As FileStream = New FileStream(My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\cipherText.txt", FileMode.Open, FileAccess.Read) Dim reader As BinaryReader = New BinaryReader(file) Dim data As Byte() = reader.ReadBytes(CType(file.Length, Integer)) 'step 3// Calling SignData method and store signature Dim signature As Byte() = signer.SignData(data, New SHA1CryptoServiceProvider) 'step 4// Export the public key Dim publicKey As String = signer.ToXmlString(False) MsgBox("Signature: " + Convert.ToBase64String(signature)) reader.Close() file.Close() End Sub
Friday, December 13, 2019 6:18 AM -
What do you mean by: "asking a function as a string"?
- Wayne
Friday, December 13, 2019 6:42 AM -
I was able to refresh on some of the topics. Foolish, but I was looking at the example without applying values and I overlooked the foundations like making values equal to not get overflows. Simply, I didn't apply folders to pull the CSPs. I apologize for the lame question, but hence refreshing from one Lab in 2007.Saturday, December 14, 2019 4:51 AM