【解決方法】コードのエラー: crtlsvalidheappointer(block)


これは私のコードです:

void CScaricoDoc::PrintCodeZebraTesto(TCHAR *szPrinter, TCHAR *szBarcode, std::string &strPathZebra)
{
	BOOL							bRet, bEsisPrinter;
	BYTE							*pchTesto, *pchBuffOut;
	CHAR							chBarcode[256];
	TCHAR                           chDriverName[256], chDoc[256];
	size_t							nLenBarcode;
	int                             nbytes;
	WORD                            buffLen, *pLen;
	DWORD                           cbNeeded;
	FILE                            *fp;
	HDC                             hdc;
	HANDLE                          han;
	DEVMODE                         DM;
	DOCINFO                         infsta;
	PRINTER_INFO_2                  *pprint;


	CString cs(strPathZebra.c_str());

	TCHAR * szPathZebra = cs.GetBuffer();

	CStringA  chCodLeather = "230208010013";

	bRet = TRUE;
	bEsisPrinter = FALSE;
	chDriverName[0] = '\0';
	if (OpenPrinter(szPrinter, &han, NULL))
	{
		GetPrinter(han, 2, NULL, 0, &cbNeeded);                      // richiedo informazioni
		if (cbNeeded > 0)
		{
			pprint = (PRINTER_INFO_2 *)calloc(cbNeeded, sizeof(BYTE));
			if (pprint)
			{
				if (GetPrinter(han, 2, (LPBYTE)pprint, cbNeeded, &cbNeeded))
				{
					if (pprint->pDevMode)
					{
						_tcscpy_s(chDriverName, 256, pprint->pDriverName);
						memcpy(&DM, pprint->pDevMode, sizeof(DEVMODE));
						bEsisPrinter = TRUE;
					}
				}
				free(pprint);
				pprint = NULL;
			}
		}
		ClosePrinter(han);
	}

	if (bEsisPrinter)
	{		
			pchTesto = NULL;
			pchBuffOut = NULL;

#ifdef _UNICODE
			WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, szBarcode, -1, chBarcode, 256, NULL, NULL);
#else
			_tcscpy_s(chBarcode, 256, szBarcode);
#endif
			nLenBarcode = strlen(chBarcode);
		{
			nbytes = strPathZebra.size()*2;

			if (nbytes > 0)
			{
				//pchTesto = (BYTE *)calloc(nbytes + 1, sizeof(BYTE));
				CT2A temp(cs); // convert from CString to CT2A
				pchTesto = (BYTE *)(char *)temp;
				//BYTE *p = (BYTE*)(const char*)cs;
				pchBuffOut = (BYTE *)calloc(nbytes + nLenBarcode + 3, sizeof(BYTE));
				//pchTesto = pByte;
				//nbytes = (int)fread(pchFile, sizeof(unsigned char), nbytes + 1, fp);

				if (nbytes > 0)																		// Ho letto il file testo
				{
					//sprintf_s((char *)pchBuffOut + 2, nbytes + nLenBarcode + 1, /*(char *)pchTesto*/cs, chBarcode);
					sprintf_s((char *)pchBuffOut + 2, nbytes + nLenBarcode + 1, "%s%s", (char *)pchTesto, chBarcode);
					//sprintf_s((char *)cs.GetBuffer() + 2, nbytes + nLenBarcode + 1, (char *)nbytes, chBarcode);
					pLen = (WORD *)pchBuffOut;
					buffLen = (WORD)strlen((char *)pchBuffOut + 2);
					(*pLen) = buffLen;

					_tcscpy_s(chDoc, 256, _T("Label zebra"));
					std::memset(&infsta, 0, sizeof(infsta));
					infsta.cbSize = sizeof(DOCINFO);
					infsta.lpszDocName = chDoc;

					hdc = CreateDC(chDriverName, szPrinter, NULL, &DM);
					if (hdc)
					{
						StartDoc(hdc, &infsta);
						bRet = (ExtEscape(hdc, PASSTHROUGH, buffLen + 2, (LPCSTR)pchBuffOut, 0, NULL) > 0) ? FALSE : TRUE;
						EndDoc(hdc);
						DeleteDC(hdc);
					}
				}

				if (pchTesto) { free(pchTesto); pchTesto = NULL; }
				if (pchBuffOut) { free(pchBuffOut); pchBuffOut = NULL; }
			}

		}
	}
	return;
}

私が試したこと:

インターネットで検索しようとしたところ、メモリの損失であると読みました。メモリを解放するときは、ポインタ pchTesto と pchBuffOut に依存すると思います。

解決策 2

これがメモリのバグであることは明らかなので、「mystory」コード行を分析してください。 API 呼び出しに十分なメモリが提供されていないと思われます。 API はデータとそのサイズを埋めるためにメモリ ブロックを取得する必要がある場合があるため、関数に関するドキュメントを詳しく読んでください。

コード内でシングル ステップ モードを実行して、場所を見つけます。 知識を高めるために、いくつかのデバッグ チュートリアルにアクセスしてください。

幸運を ;-)

解決策 3

まず、「malloc」を使用して、作業中のデータに十分なメモリが割り当てられていることを確認します。

コードには、メモリが割り当てられるインスタンス (pprint、pchTesto、pchBuffOut) がいくつかありますが、解放するのは最後に pprint だけです。 割り当てられたすべてのメモリを必ず解放してください。

「pchTesto」と「pchBuffOut」にメモリを正しく割り当てるには、次のようなことを試してください –

// Allocate memory for pchTesto
BYTE* pchTesto = nullptr;
size_t nLen = strPathZebra.size();
if (nLen > 0)
{
    pchTesto = (BYTE*)malloc(nLen + 1);
    memcpy(pchTesto, szPathZebra, nLen + 1);
}

// Allocate memory for pchBuffOut
size_t buffSize = nbytes + nLenBarcode + 3;
BYTE* pchBuffOut = (BYTE*)malloc(buffSize);

完了したら、すべてのメモリ割り当てをクリアします –

// Free allocated memory for pchTesto
free(pchTesto);

// Free allocated memory for pchBuffOut
free(pchBuffOut);

コメント

タイトルとURLをコピーしました