WIN32_FIND_DATA это правда [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 WIN32_FIND_DATA это правда [закрыто]

Сообщение Anonymous »

Это правда? Я хочу использовать WIN32_FIND_DATA для C#. Я хочу проверить, есть ли в приведенном ниже коде какие-либо ошибки для C#.
Пожалуйста, покажите мне другой способ, если вы найдете другой код получше.
Привет всем, привет. бродяга bejafoanc nsfkck Это правда? Я хочу использовать WIN32_FIND_DATA для C#. Я хочу проверить, есть ли в приведенном ниже коде какие-либо ошибки для C#.
Пожалуйста, покажите мне другой способ, если вы найдете другой код получше.
Привет всем, привет. бродяга bejafoanc nsfkck

using System;
using System.Reflection.PortableExecutable;
using System.Runtime.InteropServices;
using System.Text;

class Program
{
// Khai báo P/Invoke cho WinHttpOpen
[DllImport("winhttp.dll", SetLastError = true)]
public static extern IntPtr WinHttpOpen(
[MarshalAs(UnmanagedType.LPWStr)] string pwszUserAgent, // User-Agent
uint dwAccessType, // Loại truy cập mạng (proxy hoặc không)
string pwszProxyName, // Tên proxy (hoặc null)
string pwszProxyBypass, // Bypass proxy (hoặc null)
uint dwFlags // Cờ cho phiên làm việc
);

// Khai báo P/Invoke cho WinHttpConnect
[DllImport("winhttp.dll", SetLastError = true)]
public static extern IntPtr WinHttpConnect(
IntPtr hSession, // Handle của session
[MarshalAs(UnmanagedType.LPWStr)] string pswzServerName, // Tên máy chủ (hostname)
ushort dwServerPort, // Cổng máy chủ
uint dwReserved // Dành cho mở rộng
);

// Khai báo P/Invoke cho WinHttpOpenRequest
[DllImport("winhttp.dll", SetLastError = true)]
public static extern IntPtr WinHttpOpenRequest(
IntPtr hConnect, // Handle của kết nối
[MarshalAs(UnmanagedType.LPWStr)] string pwszVerb, // Phương thức HTTP (GET, POST, v.v.)
[MarshalAs(UnmanagedType.LPWStr)] string pwszObjectName, // Đường dẫn tới đối tượng
[MarshalAs(UnmanagedType.LPWStr)] string pwszVersion, // Phiên bản HTTP
[MarshalAs(UnmanagedType.LPWStr)] string pwszReferer, // Referer URL
IntPtr ppwszAcceptTypes, // Các loại MIME chấp nhận
uint dwFlags // Cờ cho yêu cầu
);

// Khai báo P/Invoke cho WinHttpSendRequest
[DllImport("winhttp.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool WinHttpSendRequest(
IntPtr hRequest, // Handle của yêu cầu
[MarshalAs(UnmanagedType.LPWStr)] string pwszHeaders, // Tiêu đề HTTP
uint dwHeadersLength, // Độ dài của tiêu đề
IntPtr lpOptional, // Dữ liệu tùy chọn
uint dwOptionalLength, // Độ dài dữ liệu tùy chọn
uint dwTotalLength, // Độ dài tổng thể
IntPtr dwContext // Dữ liệu ngữ cảnh
);

// Khai báo P/Invoke cho WinHttpReceiveResponse
[DllImport("winhttp.dll", SetLastError = true)]
public static extern bool WinHttpReceiveResponse(
IntPtr hRequest, // Handle của yêu cầu
IntPtr lpReserved // Dành cho mở rộng
);

// Khai báo P/Invoke cho WinHttpQueryDataAvailable
[DllImport("winhttp.dll", SetLastError = true)]
public static extern bool WinHttpQueryDataAvailable(
IntPtr hRequest, // Handle của yêu cầu
ref uint dwSize // Kích thước dữ liệu sẵn có
);

// Khai báo P/Invoke cho WinHttpReadData
[DllImport("winhttp.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool WinHttpReadData(
IntPtr hRequest, // Handle của yêu cầu
IntPtr lpBuffer, // Buffer để đọc dữ liệu
uint dwSize, // Kích thước dữ liệu cần đọc
ref uint dwDownloaded // Kích thước dữ liệu đã tải xuống
);

[DllImport("winhttp.dll", SetLastError = true)]
public static extern bool WinHttpWriteData(
IntPtr hRequest,
IntPtr lpBuffer,
uint dwNumberOfBytesToWrite,
ref uint dwNumberOfBytesWritten);

// Khai báo P/Invoke cho WinHttpCloseHandle
[DllImport("winhttp.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool WinHttpCloseHandle(IntPtr hInternet);

// Các giá trị cố định
public const uint WINHTTP_ACCESS_TYPE_NO_PROXY = 1; // Không sử dụng proxy
public const uint WINHTTP_NO_PROXY_NAME = 0; // NULL
public const uint WINHTTP_NO_PROXY_BYPASS = 0; // NULL
public const ushort INTERNET_DEFAULT_HTTP_PORT = 80; // Cổng mặc định cho HTTP
public const ushort INTERNET_DEFAULT_HTTPS_PORT = 443; // Cổng mặc định cho HTTPS

static void Main(string[] args)
{

string url = "http://localhost:8080/api/upload"; // Địa chỉ API của bạn
string filePath = @"D:\test1.txt"; // Đường dẫn đến file bạn muốn upload
string input = "some text"; // Dữ liệu văn bản

// Khởi tạo WinHTTP
IntPtr hSession = WinHttpOpen("WinHTTP Example/1.0", 0, null, null, 0);
IntPtr hConnect = WinHttpConnect(hSession, "localhost", 8080, 0);
IntPtr hRequest = WinHttpOpenRequest(hConnect, "POST", "/api/todos/upload", null, null, IntPtr.Zero, 0);

// Tạo headers cho multipart/form-data
string boundary = "------------------------" + DateTime.Now.Ticks.ToString("x");
string header = $"Content-Type: multipart/form-data; boundary={boundary}\r\n";

// Gửi request đầu tiên
bool send = WinHttpSendRequest(hRequest, header, (uint)header.Length, IntPtr.Zero, 0, 400, IntPtr.Zero);
// Gửi dữ liệu văn bản
string textPart = $"--{boundary}\r\nContent-Disposition: form-data; name=\"textData\"\r\n\r\n{input}\r\n";
byte[] textBytes = Encoding.UTF8.GetBytes(textPart);
IntPtr ptrText = Marshal.AllocHGlobal(textBytes.Length);
Marshal.Copy(textBytes, 0, ptrText, textBytes.Length);

uint bytesWritten = 0;
bool writeData = WinHttpWriteData(hRequest, ptrText, (uint)textBytes.Length, ref bytesWritten);
int error = Marshal.GetLastWin32Error();
Marshal.FreeHGlobal(ptrText);

// Gửi file
string filePart = $"--{boundary}\r\nContent-Disposition: form-data; name=\"files[]\"; filename=\"{Path.GetFileName(filePath)}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
byte[] filePartBytes = Encoding.UTF8.GetBytes(filePart);
IntPtr ptrFilePart = Marshal.AllocHGlobal(filePartBytes.Length);
Marshal.Copy(filePartBytes, 0, ptrFilePart, filePartBytes.Length);

bool writeData1 = WinHttpWriteData(hRequest, ptrFilePart, (uint)filePartBytes.Length, ref bytesWritten);
int error1 = Marshal.GetLastWin32Error();
Marshal.FreeHGlobal(ptrFilePart);

// Gửi nội dung file
byte[] fileBytes = File.ReadAllBytes(filePath);
IntPtr ptrFile = Marshal.AllocHGlobal(fileBytes.Length);
Marshal.Copy(fileBytes, 0, ptrFile, fileBytes.Length);
bool writeData2 = WinHttpWriteData(hRequest, ptrFile, (uint)fileBytes.Length, ref bytesWritten);
int error2 = Marshal.GetLastWin32Error();
Marshal.FreeHGlobal(ptrFile);

// Kết thúc request với boundary
string endBoundary = $"\r\n--{boundary}--\r\n";
byte[] endBytes = Encoding.UTF8.GetBytes(endBoundary);
IntPtr ptrEnd = Marshal.AllocHGlobal(endBytes.Length);
Marshal.Copy(endBytes, 0, ptrEnd, endBytes.Length);
bool writeData3 = WinHttpWriteData(hRequest, ptrEnd, (uint)endBytes.Length, ref bytesWritten);
int error3 = Marshal.GetLastWin32Error();
Marshal.FreeHGlobal(ptrEnd);

// Nhận phản hồi
WinHttpReceiveResponse(hRequest, IntPtr.Zero);
uint dataSize = 0;
if (WinHttpQueryDataAvailable(hRequest, ref dataSize) && dataSize > 0)
{
// Tạo buffer để chứa dữ liệu phản hồi
IntPtr buffer = Marshal.AllocHGlobal((int)dataSize);

try
{
uint bytesRead = 0;

// Đọc dữ liệu từ phản hồi
if (WinHttpReadData(hRequest, buffer, dataSize, ref bytesRead))
{
// Chuyển đổi dữ liệu từ buffer sang chuỗi
byte[] responseBytes = new byte[bytesRead];
Marshal.Copy(buffer, responseBytes, 0, (int)bytesRead);

string responseText = Encoding.UTF8.GetString(responseBytes);

// In ra phản hồi
Console.WriteLine("Response: " + responseText);
}
else
{
Console.WriteLine("Failed to read data.");
}
}
finally
{
// Giải phóng bộ nhớ cho buffer
Marshal.FreeHGlobal(buffer);
}
}
else
{
Console.WriteLine("No data available to read.");
}
// Đóng kết nối
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
}
}



Подробнее здесь: https://stackoverflow.com/questions/790 ... a-its-true
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»