如果在.dll中使用此代码调用 socket.recv() 会引发异常STACK_OVERFLOW,但是当此代码将编译为.exe 时,它可以工作。

为什么?

我通过“.dll”运行C:\windows\system32\rundll32.exe myDll.dll StartUp -test

void StartUp()
{
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);

socket.bind("tcp://127.0.0.1:3456");
zmq::message_t msgIN, msgOUT("test", 4);
while (true){


    socket.recv(&msgIN);

    socket.send(msgOUT);
};
}

调用堆栈:
libzmq-v120-mt-gd-4_2_2.dll!zmq::mailbox_t::recv(zmq::command_t * cmd_=0x0231f700, int timeout_=0x00000000)

libzmq-v120-mt-gd-4_2_2.dll!zmq::io_thread_t::in_event()

libzmq-v120-mt-gd-4_2_2.dll!zmq::select_t::loop()

libzmq-v120-mt-gd-4_2_2.dll!zmq::select_t::worker_routine(void * arg_=0x002f1778)
libzmq-v120-mt-gd-4_2_2.dll!thread_routine(void * arg_=0x002f17c0)

主线程调用栈:
libzmq-v120-mt-gd-4_2_2.dll!zmq::signaler_t::wait(int timeout_=0xffffffff)
libzmq-v120-mt-gd-4_2_2.dll!zmq::mailbox_t::recv(zmq::command_t * cmd_=0x0019f3c0, int timeout_=0xffffffff)
libzmq-v120-mt-gd-4_2_2.dll!zmq::socket_base_t::process_commands(int timeout_, bool throttle_)
libzmq-v120-mt-gd-4_2_2.dll!zmq::socket_base_t::recv(zmq::msg_t * msg_=0x0019f628, int flags_=0x00000000)
libzmq-v120-mt-gd-4_2_2.dll!s_recvmsg(zmq::socket_base_t * s_=0x006f6c70, zmq_msg_t * msg_=0x0019f628, int flags_=0x00000000)
libzmq-v120-mt-gd-4_2_2.dll!zmq_msg_recv(zmq_msg_t * msg_=0x0019f628, void * s_=0x006f6c70, int flags_=0x00000000)
mydll.dll!zmq::socket_t::recv(zmq::message_t * msg_=0x0019f628, int flags_=0x00000000)
mydll.dll!StartUp()

更新:

此示例也因相同的原因而崩溃。有人知道异常堆栈溢出的任何原因吗?
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);

socket.bind("tcp://*:7712");

while (1){
    Sleep(10);
}

反向问题隔离MCVE:

以及 myDll.dll -test 是如何工作的,
如果由C:\windows\system32\rundll32.exe myDll.dll StartUp运行?发布屏幕输出。
void StartUp()
{
     std::cout << "INF:: ENTRY POINT ( C:\windows\system32\rundll32.exe myDll.dll StartUp )" << std::endl;
     std::cout << "INF:: WILL SLEEP  ( C:\windows\system32\rundll32.exe myDll.dll StartUp )" << std::endl;
     Sleep( 10 );
     std::cout << "INF:: SLEPT WELL  ( C:\windows\system32\rundll32.exe myDll.dll StartUp )" << std::endl;
     std::cout << "INF:: WILL RETURN ( C:\windows\system32\rundll32.exe myDll.dll StartUp )" << std::endl;
}

最佳答案

崩溃的原因是OPTIONAL_HEADER rundll32文件中的SizeOfStackCommit值。
它太小(0xC000),我将其更改为0x100000。现在所有的作品。

10-01 06:59