16,472
社区成员
发帖
与我相关
我的任务
分享
int NDlg::InputScanf(const CHAR *format, ...)
{
CHAR szBuf[1024];
szBuf[0] = 0;
GetInput(NULL, szBuf, sizeof(szBuf), "InputScanf", 300); //该函数从对话框输入字符串 已经写好
...//格式化输入的转换 如何写?
}
//printf 改写写入文件 NLog::LogPrintf
int NLog::LogPrintf(CONST CHAR * lpszFormat, ...)
{
CHAR * buf = NULL;
int nRetVal = -1, nSize = 4096;
va_list args;
if(lpszFormat == NULL)
return Logs(NULL);
va_start(args, lpszFormat);
for(; nRetVal<0 ; nSize*=2)
{
if(buf)
free(buf);
buf = (CHAR *)malloc( (nSize+2)*sizeof(CHAR) );
nRetVal = _vsnprintf(buf, nSize, lpszFormat, args);
}
va_end(args);
nRetVal = Logs(buf);
if(buf)
free(buf);
return nRetVal;
}
int NLog::Logs(CHAR *pString, CHAR *pLogFile)
{
HANDLE hFile;
int nLen, nError;
BOOL bRetVal;
DWORD dwRetVal, dwLenWrite;
if(pLogFile == NULL)
{
pLogFile = s_ThisLogFile;
}
if(pString == NULL)
{
hFile = CreateFileA(pLogFile, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL, CREATE_ALWAYS , 0, NULL);
CloseHandle(hFile);
return 0;
}
hFile = CreateFileA(pLogFile, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL, OPEN_ALWAYS, 0, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
return -1;
}
nLen = (int)strlen(pString);
dwRetVal = SetFilePointer(hFile, 0, 0, FILE_END);
if(dwRetVal == 0xFFFFFFFF)
{
nError = ::GetLastError();
if(nError != NO_ERROR)
{
CloseHandle(hFile);
::SetLastError(nError);
return -1;
}
}
bRetVal = WriteFile(hFile, pString, nLen, &dwLenWrite, NULL);
if(bRetVal == FALSE)
{
nError = ::GetLastError();
CloseHandle(hFile);
::SetLastError(nError);
return -1;
}
CloseHandle(hFile);
return dwLenWrite;
}
__declspec(naked) int NDlg::InputScanf(const CHAR *format, ...)
{
static CHAR szBuf[1024];
static BYTE ** pReqsAddr;
static BYTE * pOldValue;
static BYTE * OldEsp;
static BYTE * SetEsp;
static BYTE * OldEbx;
static BYTE * OldEcx;
static BYTE * OldEdx;
static BYTE * OldEsi;
static BYTE * OldEdi;
static BYTE * OldEbp;
static int UintSize = sizeof(int);
__asm mov OldEbx, ebx;
__asm mov OldEcx, ecx;
__asm mov OldEdx, edx;
__asm mov OldEsi, esi;
__asm mov OldEdi, edi;
__asm mov OldEbp, ebp;
__asm sub esp, UintSize
__asm mov ebp, esp
__asm sub esp, __LOCAL_SIZE
pReqsAddr = (BYTE **)(&format - 1);
SetEsp = (BYTE *)(pReqsAddr);
pOldValue = *pReqsAddr;
szBuf[0] = 0;
GetInput(NULL, szBuf, sizeof(szBuf), "InputScanf", 300);
*pReqsAddr = (BYTE *)szBuf;
__asm mov OldEsp, esp;
__asm mov esp, SetEsp;
__asm call sscanf
__asm mov esp, OldEsp;
*pReqsAddr = pOldValue;
__asm mov ebx, OldEbx;
__asm mov ecx, OldEcx;
__asm mov edx, OldEdx;
__asm mov esi, OldEsi;
__asm mov edi, OldEdi;
__asm mov esp, ebp
__asm mov ebp, OldEbp;
__asm add esp, UintSize
__asm ret
}
int NDlg::InputScanf(const CHAR *format, ...)
{
CHAR szBuf[1024];
szBuf[0] = 0;
GetInput(NULL, szBuf, sizeof(szBuf), "InputScanf", 300);
int result;
LPCSTR buffer = szBuf;
LPCSTR p = format;
int count = 1;
while (*p != 0)
{
if (*p++ == '%') count++;
}
int len = count << 2;
__asm {
pushad
mov ecx, len
sub esp, ecx
lea esi, format
mov edi, esp
rep movsb
push buffer
call sscanf
mov result, eax
pop eax
add esp, len
popad
}
}
void InputScanf(const char* format, ...)
{
va_list arg_ptr;
va_start(arg_ptr, format);
std::stack<int> args;
int arg =0;//每个参数
int number=0;//参数个数
char szTest[] = "12 34";//test Input Text
char* Point = &szTest[0];//point to c-style string
/*
**本函数规定以-1为结束标志
*/
while(arg != -1)
{
++number;
arg = va_arg(arg_ptr,int);
args.push(arg);
}
va_end(arg_ptr);
for(int i=0;i<number;++i)
{
arg= args.top();
args.pop();
__asm push arg;//__cdecl右到左压栈
}
__asm push format;
__asm push Point;
__asm call sscanf;//.
}