2013-05-03 73 views
3

我正在嘗試使用C++ dll編寫簡單的擴展存儲過程來將一些文本寫入控制檯。我在接下來的方式進行的:爲什麼我的C++擴展存儲過程不能寫入控制檯?

  1. 創建使用C++(看的.cpp及以下.h文件)
  2. 測試從Win32控制檯應用程序此DLL(所有的工作抽動德趾)
  3. 一個dll
  4. 舉動得到了dll文件到SQL Server的bin目錄
  5. 從管理工作室執行sp_addextendedproc 'xp_test','xp_test.dll'
  6. 執行擴展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; 
} 
+0

你使用什麼編譯器?這可能是一個依賴性問題,請確保所有內容都靜態鏈接到您的程序中。 – demorge 2013-05-03 17:28:43

+0

@demorge VS 2010終極版 – user2201747 2013-05-03 17:35:04

+0

試試這個:項目屬性頁面 - >配置道具 - > C/C++ - >代碼生成 - >運行時庫 - >現在選擇那些無w/o DLL進行調試和發佈。 – demorge 2013-05-03 17:38:13

回答

1

雖然我不知道C++的東西,也沒有因爲SQL Server通常作爲服務運行而沒有交互式會話或桌面,所以目前還不清楚你希望輸出到哪裏。

作爲文檔explains,擴展存儲過程使用Extended Stored Procedure API將結果集返回給服務器,但您的代碼似乎沒有這樣做。

幸運的是,微軟實際上提供了自己的Hello World example;你有沒有檢查過它?

最後,請注意MSDN中的warnings擴展存儲過程現在已被棄用,將從SQL Server中刪除,不應用於新開發。

+0

好的,我想我已經想通了你的觀點,但是通過Console API可以解決問題,但是沒有。我知道擴展的procs現在已被棄用,但我真的需要使用它 – user2201747 2013-05-03 20:23:11

相關問題