3

我正在尝试使用 C++ dll 编写简单的扩展存储过程,以便将一些文本写入控制台。我已经通过以下方式做到了:

  1. 使用 c++ 创建了一个 dll(查看下面的 .cpp 和 .h 文件)
  2. 从 win32 控制台应用程序测试了这个 dll(都作为井字游戏工作)
  3. 将获取的 dll 文件移动到 sql server bin 目录中
  4. sp_addextendedproc 'xp_test','xp_test.dll'从管理工作室执行
  5. 执行扩展 proc( exec xp_test)

当我执行最后一步时,会出现一个提示,通知我查询已成功执行,但没有任何带有预期 hello world 提示的控制台窗口。我的错在哪里?

//test.h file
#ifdef MYLIBAPI
#else
#define MYLIBAPI extern "C" __declspec(dllimport)
#endif
#include <srv.h>
MYLIBAPI SRVRETCODE xp_test(SRV_PROC *srvproc);
// xp_test.cpp : Defines the exported functions for the DLL application.
#include "stdafx.h"
#define MYLIBAPI extern "C" __declspec(dllexport)
#include "test.h"
#include <iostream>
using namespace std;

SRVRETCODE xp_test(SRV_PROC *srvproc){
    cout << "Hello world" << endl;
    cin.get();
    return 0;
}

我也尝试过使用控制台 API,但这也不允许写入控制台

SRVRETCODE xp_test(SRV_PROC *srvproc){
    AllocConsole();
    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD writtenCount;
    LPCTSTR msg = L"Hello world\n";
    WriteConsole(out, msg, lstrlen(msg), &writtenCount, NULL);
    Sleep(5000);
    return 0;
}
4

1 回答 1

1

虽然我对 C++ 一无所知,但没有控制台,因为 SQL Server 通常作为服务运行,没有交互式会话或桌面,因此不清楚您希望输出到哪里。

正如文档所解释的,扩展存储过程使用扩展存储过程 API将结果集返回到服务器,但您的代码似乎没有这样做。

幸运的是,微软实际上提供了自己的Hello World 示例;你审查过吗?

最后,请注意 MSDN 中的警告,即扩展存储过程现已弃用,将从 SQL Server 中删除,不应用于新的开发。

于 2013-05-03T18:20:02.450 回答