我创建了动态dll。 有趣的是,我将在visual studio 2010中构建相同的代码 工作正常,但在visual studio 2015上构建代码时,它不起作用。
#include <windows.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#define EXP __declspec(dllexport) __stdcall
using namespace std;
void SPGoConsole(int status);
void EXP ttest(int in)
{
SPGoConsole(1);
cout << "Hello world!" << endl;
}
void SPGoConsole(int status)
{
if (status == 0)
{
FreeConsole();
return;
}
int hConHandle;
long lStdHandle;
CONSOLE_SCREEN_BUFFER_INFO coninfo;
FILE *fp;
AllocConsole();
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
coninfo.dwSize.Y = 1000;
coninfo.dwSize.X = 1000;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen(hConHandle, "w");
*stdout = *fp;
cout = fp;
setvbuf(stdout, NULL, _IONBF, 0);
lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen(hConHandle, "r");
*stdin = *fp;
setvbuf(stdin, NULL, _IONBF, 0);
lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen(hConHandle, "w");
*stde
rr = *fp;
setvbuf(stderr, NULL, _IONBF, 0);
ios::sync_with_stdio();
}
我没有在visual studio 2015中使用任何特殊设置。 一切都是默认的。
如果我愿意的话:
AllocConsole();
然后我的程序第一次导入dll并调用ttest,它不打印任何东西,但第二次它调用ttest它打印出Hello world!。
然后我尝试只调用AllocConsole 2x但直到它仍然没有打印 我的程序再次被称为ttest。
编辑:似乎在程序运行后导入第二个dll后,它开始打印。
Anyideas? 感谢