小编llk*_*llk的帖子

DLL_PROCESS_ATTACH无法在Windows 7 C++上执行

我正在尝试加载.dll文件,并在加载时显示一个消息框.根据我的理解,一旦.dll加载,它就会调用dllmain()并切换到该DLL_PROCESS_ATTACH选项.我已经编写了加载它的代码.dll和代码.exe.在.exe能够正确加载并打印出该DLL已加载的地址,但我没有看到正在显示一个消息框.我在Microsoft.com上的某个地方读到,dll在加载时进入"锁定",以防止出于安全目的而执行某些功能或代码.此功能是否阻止显示消息框?是否存在诸如提升权限,系统等的工作......?我不确定DEP是否有任何影响,我将其设置为仅保护关键的Windows进程.

调用过程:

#include <iostream>
#include <windows.h>
int main()
{
    HMODULE hDll = LoadLibraryA("dll.dll");
    if (hDll == NULL)
        std::cerr << "Unable to load dll";
    else
        std::cout << "Dll loaded @ " << hDll;
    FreeLibrary(hDll);
}
Run Code Online (Sandbox Code Playgroud)

dll文件:

#include <windows.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            MessageBox(NULL, "Dll has been loaded.", "Loaded", MB_OK);
            break;
    }
    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

我认为如果我有办法运行.dll调试器并查看 …

c++ dll messagebox loadlibrary windows-7

2
推荐指数
1
解决办法
4044
查看次数

函数调用中*和&amp;运算符的区别

可能重复:
C++ 函数:& 符号与星号 与
参数组合的各种符号(*、& 等)之间有什么区别?

我想知道C++ 函数调用中地址运算符&和引用运算符之间的区别。*例如采用以下函数

void foo (std::string& param)
{
     param = "Bar.";
     std::cout << param.size();
}
Run Code Online (Sandbox Code Playgroud)

让我们在main()函数中这样调用它......

int main()
{
      std::string test;
      foo(test);          //Why not foo(&test)?
      std::cout << test;  //Prints out the value "Bar."
}
Run Code Online (Sandbox Code Playgroud)

首先,为什么&运算符允许我像指针一样分配一个值(当它不是指针时,为它分配一个在 RAII 和函数范围内保留的值),因为它可以在我的函数foo()中打印出来main()即使不是static?我假设它不是指针,因为我可以size()使用.运算符而不是->用于指针的运算符来访问该方法。

&其次,在函数参数中使用运算符与使用运算符有什么区别*?它与像这样的普通变量有什么不同吗std::string param?它似乎是这样称呼的(foo(test)而不是foo(&test))。

c++ function dereference address-operator

2
推荐指数
1
解决办法
1万
查看次数

获取组合框的文本 Win32 API C++ (NO MFC)

我正在尝试设置一个组合框,以便用户可以从下拉菜单中选择一个选项,然后使用 Win32 API C++ 编程而不是 MFC 检索用户选择的内容。我在这里阅读了约翰的帖子,但我什么也做不了。我可以设置组合框的文本,但我无法检索用户选择的内容。以下是我尝试过的几种方法:

                LPTSTR buf;
                ComboBox_GetText(hwnd, buf, 9);
                MessageBox(NULL, buf, NULL, MB_OK);
Run Code Online (Sandbox Code Playgroud)

                char* buf;
                GetDlgItemText(hwnd, IDC_COMBO1, buf, 9);
                MessageBox(NULL, buf, NULL, MB_OK);
Run Code Online (Sandbox Code Playgroud)

IDC_COMBO1是组合框的 ID,hwnd是当前对话框的 HWND。我的带有组合框的对话框的代码是:

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG4 DIALOG 0, 0, 424, 181 STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU CAPTION "Dialog" FONT 8, "Ms Shell Dlg" { COMBOBOX IDC_COMBO1, 113, 31, 119, 19, CBS_DROPDOWN | CBS_HASSTRINGS PUSHBUTTON "Button1", IDC_BUTTON1, …

c++ api winapi text combobox

1
推荐指数
1
解决办法
1万
查看次数

将文件保存到C++中用户输入定义的位置和名称

我在将在控制台窗口中创建的文本文件保存到由用户输入定义的自定义位置时遇到一些问题.我希望它采用字符串filepath作为保存位置,并将其与字符串组合,该字符串filename将是用户选择的文本文件的名称.比如这个C:\users\bobbert\desktop\c++.txt我想要一个第三个字符串,它将是写入c ++ .txt文件的实际文本.这是我的代码:

cout<<"Please enter a name for your file: "<<endl;
cin>>filename;

cout<<"Please enter a directory to save your file in: "<<endl;
cin>>filepath;

//user is now typing data into the text file
cin>>data;
//the data is now being grabbed and put into the "Data" string

FILE * pFile;
pFile = fopen (filepath.c_str() + filename.c_str(),"a");

//trying to combine the users selected directory + the selected filename here

if (pFile!=NULL)
{
    fputs(data.c_str(), pFile);
    //here i am …
Run Code Online (Sandbox Code Playgroud)

c++ string text user-input file

0
推荐指数
1
解决办法
3988
查看次数

如何在VC++ 2010中使用.dll文件启动进程

我试图学习如何在C++中使用DLL文件.根据我的研究,当我在我的代码中使用DisplayNotepad()时,这应该打开记事本.我正在尝试编译它,但我收到编译器错误,我知道事实上windows.h定义了ShellExecute,但它说找不到标识符.这是我的代码:

#include "stdafx.h"
#include <windows.h>
#include <iostream>
extern "C"
{
__declspec(dllexport) void DisplayNotepad()
 {
     ShellExecute(NULL, "open", "c:\\windows\\notepad.exe", NULL,NULL, SW_SHOW);
 }
}
Run Code Online (Sandbox Code Playgroud)

我的编译器给出了以下错误:错误C3861:'ShellExecute':找不到标识符.我这样做完全错了吗?感谢您的投入.

c++ dll file process

0
推荐指数
1
解决办法
1437
查看次数

MessageBox产生的输出不同于Cout C++

我试图通过调用它的VM地址来加载图像的名称,GetModuleFileName()这似乎正确地将值返回到TCHAR[]数组中.我能够正确显示数据,MessageBox()cout <<似乎显示一些时髦的十六进制数字.

TCHAR buf[MAX_PATH];
HMODULE hProc = LoadLibrary(TEXT("kernel32.dll"));
GetModuleFileName(hProc, buf, MAX_PATH);
cout << buf; //Produces the odd number
MessageBox(NULL, buf, NULL, MB_OK); //Produces correct filepath
FreeLibrary(hProc);
Run Code Online (Sandbox Code Playgroud)

我应该设置一个标志,cout以便它知道正确打印吗?谢谢!

c++ io

0
推荐指数
1
解决办法
139
查看次数