fputs (text, filePtr) возвращает только первый символ LPARAM из SendMessage вместо всей строки - PullRequest
0 голосов
/ 06 февраля 2020

Я пишу программу WIN32API C с использованием макросов Edit_SetText и Edit_GetText из заголовочного файла windowsx.h и SendMessage для сохранения из текстового поля редактирования в файл с помощью fputs. Edit_SetText получает содержимое буфера штрих-кода сканирования (LPTSTR) и сохраняет его в дескриптор текстового поля редактирования. Помимо отображения содержимого буфера в текстовом поле редактирования, я также хочу сохранить в файл. Я использовал SendMessage и Edit_GetText, чтобы получить LPSTR. SendMessage дает мне LPARAM с именем text.

Я использую Edit_GetText для извлечения содержимого текстового поля в text1 (см. Код ниже). Перед сохранением в файл с помощью fputs я отображаю содержимое буфера в окнах сообщений, чтобы обеспечить захват всего штрих-кода. Однако, когда я снова открываю текстовый файл, я обнаруживаю, что fputs сохраняет только первый символ вместо всей строки штрих-кода, которая отображается в окне сообщения. Как сохранить полную строку, а не только первый символ этой строки? Почему обрезка всего, кроме первого символа? Вот мой код ниже:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <windowsx.h>

//Variables
char text[30];
char text1[30];
FILE * fPtr;
char text[60];
HWND hctl_data;

//Open text file for write
fPtr = fopen("barcodedata.txt", "w");

//Get edit textbox handle (IDC_EDIT_DATA)
hctl_data = GetDlgItem(hwnd,IDC_EDIT_DATA);

//Retrieve scan buffer contents and display in edit text box
Edit_SetText(hctl_data, (LPTSTR)SCNBUF_GETDATA(lpScanBuffer));

//SendMessage retrieves from the edit textbox handle to text
SendMessage(hctl_data, WM_GETTEXT, 20, (LPARAM)text);

//Another way to retrieve from the edit textbox handle to a variable, text1
Edit_GetText(hctl_data, &text1, 20);

//Show in message box that the full barcode string is captured (19 characters in length)
MessageBox(0, text, TEXT("InfoA"), MB_OK);
MessageBox(0, text1, TEXT("InfoB"), MB_OK);

//Now save text and text1 to a text file using fputs (or frintf)
fputs(text, fPtr);
fputs(text1, fPtr);

//close file
fclose(fPtr);

1 Ответ

1 голос
/ 06 февраля 2020

Обычно Unicode-версия символа ANSI добавляет \0 после исходного байта. такие как:

L"ABC" <==> "A\0B\0C\0"

Когда мы используем многобайтовую версию API и передаем широкую байтовую строку, \0 между символами обычно интерпретируется в качестве ограничителя строки. По этой причине отображается только первый символ.

Решение:

#define UNICODE 1
#define _UNICODE 1

char[] => wchar_t[];

fopen("barcodedata.txt", "w"); => _tfopen(TEXT("barcodedata.txt"), TEXT("w"));

fputs => _fputts;

Мы должны уделять больше внимания, когда мы используем смешанные многобайтовые и широкие байтовые функции. Или рекомендуется использовать широкобайтовую версию для всего контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...