C++ Microsoft REST API не работает с Imgur API с использованием BITMAP в приложении Win32
Примечание: я впервые использую RESTful API, поэтому, если я делаю что-то невероятно неправильное, просто предупредите меня.
Моя проблема в том, что у меня есть HBITMAP
что я превращаю в BITMAP
, который я пытаюсь преобразовать в char*
, Я пытаюсь загрузить это char*
Имгур как type:file
, Тем не менее, он выдает одну из двух ошибок. Раньше он просто ничего не копировал в буфер обмена и продолжал, но в последнее время выдает это сообщение об ошибке:
First-chance exception at 0x00704380 (msvcr120d.dll) in SampleShot.exe: 0xC0000005:
Access violation reading location 0x00000000.
Unhandled exception at 0x00704380 (msvcr120d.dll) in SampleShot.exe: 0xC0000005: Access violation reading location 0x00000000.
The program '[4356] SampleShot.exe' has exited with code 0 (0x0).
То, что я знаю, работает: создание HBITMAP
и, вероятно, создавая BITMAP
, В остальном я не уверен.
Код, о котором идет речь (несвязанные части отредактированы):
#include <windows.h>
#include <string>
#include <iostream>
#include <cpprest/http_client.h>
#include <cpprest/filestream.h>
#define ID_FILE_EXIT 9001
#define ID_FILE_SAVE 9002
using namespace utility;
using namespace web::http;
using namespace web::http::client;
const char g_szClassName[] = "myWindowClass";
utility::string_t readTheJson(web::json::value v)
{
for (auto iter = v.cbegin(); iter != v.cend(); ++iter)
{
const web::json::value &key = iter->first;
const web::json::value &value = iter->second;
if (key.to_string() == U("data")) {
return value.to_string();
}
}
return NULL;
}
utility::string_t uploadBitmap(BITMAP bitmap)
{
http_client client(L"https://api.imgur.com/3/image.json");
char* bitString[sizeof(bitmap)+1];
memcpy(&bitString, &bitmap.bmBits, sizeof(bitmap));
if (bitString == NULL) {
std::cout << "BITSTRING IS NULL" << std::endl;
}
uri_builder builder;
builder.append_query(L"Client-ID", L"%%%%%%%%%%%%%%%%%%%%%");
builder.append_query(L"image", *bitString);
builder.append_query(L"type", L"file");
utility::string_t builderString = builder.to_string();
pplx::task<http_response> resp = client.request(methods::POST, builderString, L"");
http_response response = resp.get();
int stcode = response.status_code();
pplx::task<web::json::value> jsonTask = response.extract_json();
web::json::value jsonR = jsonTask.get();
return readTheJson(jsonR);
}
// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_LBUTTONDOWN:
{
HDC screenDC = GetDC(NULL);
HDC compatibleScreenDC = CreateCompatibleDC(screenDC);
HBITMAP screenBitmap = CreateCompatibleBitmap(screenDC, 1920, 1080);
BITMAP bitmap;
SelectObject(compatibleScreenDC, screenBitmap);
BitBlt(compatibleScreenDC, 0, 0, 1920, 1080, screenDC, 0, 0, SRCCOPY);
GetObject(screenBitmap, sizeof(BITMAP), &bitmap);
DeleteDC(screenDC);
DeleteDC(compatibleScreenDC);
utility::string_t imgurLink = uploadBitmap(bitmap);
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_TEXT, &imgurLink);
CloseClipboard();
}
break;
РЕДАКТИРОВАТЬ: Я думаю, что это как-то связано с memcpy
вызов,
memcpy(&bitString, &bitmap.bmBits, sizeof(bitmap));