2017-08-21 19 views
3

私は/ mtでコンパイルされたDLLを持っています。 DLLはrundll32でcmdから呼び出す関数 'main'をエクスポートします。この関数は、環境変数のレジストリに格納されているいくつかの設定を取る予定のヘッダから別のものを呼び出します。私がやっているか想像するに、ここでのコードの一部です:このブレークポイントは現在ヒットしません:Dllデバッグ

DLL:メイン

#include "..\Header.h" 

extern "C" void APIEXP WINAPI main(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow){ 
    char *parentPath = nullptr; 
    size_t sz; 
    DWORD buffSize; 
    block; //this is a messagebox 
    buffSize = sizeof(client.pc_name); 

    if (!GetComputerNameA(client.pc_name, &buffSize)) strcpy(client.pc_name, ""); 
    if (!GetUserNameA(client.user_name, &buffSize)) strcpy(client.user_name, ""); 
    client.os_time = time(0); 
    client.version = Version; 
    client.os_version = Exe_version; 
    TextSetting("pc_description", client.pc_description); 
    TextSetting("custom_name", client.custom_name); 
} 

LPSTR TextSetting(LPSTR setting,LPSTR buff) { 
    //Returns all data in buff 
    DWORD type, sz; 
    msg("dll: ","function called"); 

    if (RegGetValueA(HKEY_CURRENT_USER,"Environment", setting, RRF_RT_REG_SZ | RRF_RT_REG_MULTI_SZ, &type, (LPBYTE)buff, &sz) != ERROR_SUCCESS) { 
     buff[0] = 0; 
     msg("sdsv: ", "err"); 
     return buff; 
    } 

    return buff; 
} 
LPSTR con(LPSTR dest, LPSTR a, LPSTR b, LPSTR c) { 
    //c is optional and default: "" 
    strcpy(dest, a); 
    strcat(dest, b); 
    strcat(dest, c); 

    return dest; 
} 
VOID msg(LPSTR app,LPSTR a) { 
    char temp_buffer[2048]; 
    con(temp_buffer , app,a, "\n"); 
    OutputDebugStringA(temp_buffer); 
} 

ヘッダーは、上記のコードは完璧に動作します:注目点をここにメインのTextSettingがあります。データを必要に応じて取得します。しかし、TextSettingからmsg("dll: ","function called");を削除すると、単にエラーが返されます(戻りコードはERROR_SUCCESSではありません)。さらに、私は関数をデバッグすることはできません。rundll32プロセスにデバッガを接続すると、TextSettingsのif文に設定したブレークポイントがタイトルに記載されている警告になります。ここで

が働いている: enter image description here

をこれは奇妙です: enter image description here

私が気づいたいくつかの余分なもの: それは私がMSGや詐欺の関数を呼び出した場合(それが詐欺で使用されるstrの*関数のように見える作品コードを動作させる)。さらに:if文の前にstrcpyとstrcatだけを使用すれば動作します。問題が何であるかわかりません(if文で使用されているコードを奇妙に修正するバッファオーバーフローがありますか?)

+0

ここでは、「デバッグ設定」でコンパイルしましたか? – AndyG

+0

最初はリリースされていますが、デバッグは行われません。 Releaseの下では、デバッガが動作するはずだと分かっていたので変です。しかしそれはそうです。プロジェクトは大きく、以前はDebugに変更したことがありません(数回だけ)。どのような動作にも影響しないと私は考えています。リリースではスクリーンショットが取られます。 –

+0

最適化をオフにしてデバッグシンボルを生成すると、リリース構成でデバッグが機能します。デバッグ構成のポイントは、それを簡単にすることです。 – AndyG

答えて

4

RegGetValue API関数は、最後のパラメータがバッファのサイズであると想定しています。 初期化されていない変数をそこに渡しています。 これは、リリース/デバッグの動作が異なるためです。 RegGetValue

+0

はい、実際は問題でした。ありがとうございました。私はその文書をよく読んでいたはずです。 –

関連する問題