2016-09-16 1 views
-2

У меня есть функция для ввода dll, а второй параметр - char*. Итак, я пытаюсь конвертировать мой полный путь к DLL (включая ваше имя + расширение), то есть CString - char*, но генерирует странные символы.CString to char * преобразование, генерирующее странные символы

Кто-то может мне помочь, пожалуйста?

Вот:

bool Inject(DWORD pId, char *dllName); // Signature of my dll inject method 

    CString szMyDllName = L"myDll.dll"; 
    CString MyDllPath = L""; 

    void CSpecialLauncherDlg::OnBnClickedStartDebugging() { 

    wchar_t path[MAX_PATH] = {0}; 
    GetModuleFileName(NULL, path, _MAX_PATH); 

    CString szPath = path; 

    int pos = szPath.ReverseFind('\\'); 
    if (pos < 0) 
     pos = 1; 
    else 
     pos += 1; 

    MyDllPath = szPath.Left(pos); 
    MyDllPath.AppendFormat(szMyDllName); 

} 

void CSpecialLauncherDlg::DebuggerThreadProc() { 

    // Here is my conversion from CString to char* 

    char* pStr = CT2A(MyDllPath); 

    LPCTSTR pszCharacterString = CA2W(pStr); 

    AfxMessageBox(pszCharacterString);// Generating strange characters here 

    Inject(pi.dwProcessId, pStr); // Then, dll injection fails :-(

} 

EDIT:

Dll впрыснуть метод ниже

bool Inject(DWORD pId, char *dllName) 
{ 
    EnableDebugPrivilege(); 

    HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, false, pId); 
    if(h) 
    { 
     LPVOID LoadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA"); 
     LPVOID dereercomp = VirtualAllocEx(h, NULL, strlen(dllName), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 
     WriteProcessMemory(h, dereercomp, dllName, strlen(dllName), NULL); 
     HANDLE asdc = CreateRemoteThread(h, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, dereercomp, 0, NULL); 
     WaitForSingleObject(asdc, INFINITE); 
     VirtualFreeEx(h, dereercomp, strlen(dllName), MEM_RELEASE); 
     CloseHandle(asdc); 
     CloseHandle(h); 
     return true; 
    } 
    return false; 
} 
+0

Выполняет ли 'Inject (pi.dwProcessId, CT2A (MyDllPath)) работу? Некоторые из этих макросов генерируют анонимные временные значения, что означает, что вы не можете использовать указатель вне инструкции. – Bathsheba

+0

Есть ли причина, по которой вы хотите использовать char * в отличие от wchar *? –

+0

@RJProgrammer, да, потому что в методе инъекции в 'strlen (dllName)', 'strlen' требуется параметр' const char * '. PS: 'VirtualAllocEx'. – Saulo

ответ

-2

Решение:

CT2CA pszCharacterString = (MyDllPath); // Converted with sucess! :D 

Inject(pi.dwProcessId, pszCharacterString); 
+0

Дайте мне голосов. – Saulo

+0

Полный фиктивный. Серьезно, единственный законный голос по этому вопросу опустился. Не мясните свой вход. Исправьте интерфейс Inject и его реализацию. Избегание узнать о Unicode не приведет к качественному коду (или качественным ответам). Это тоже не так. – IInspectable

+0

@ Изначальный, но он работает! и это более важно. – Saulo