OK、何時間もグーグルで調べた後、SQL Server 2000 拡張ストアド プロシージャとして追加する DLL のコンパイルに成功しました。グーグルで集めたものをまとめただけなので、ここで共有します。(Visual Studio 2010 を使用しました)。すべてを投稿するつもりはありません。Visual Studio で新しいプロジェクトを作成し、Win32 コンソール アプリケーション、次へ、DLL の順に選択することから始めました。いくつかのヘッダー ファイルとその他のファイルが作成されます。それらのいくつかは、私が必要だとは思わなかった. また、手動でプロジェクトに追加する必要があるヘッダー ファイルの一部。しかし、ここに私のメインの .cpp コードがあります:
#include "stdafx.h"
#include "srv.h" //Must get from C:\Program Files (x86)\Microsoft SQL Server\80\Tools\DevTools\Include
#include "shellapi.h" //need for ShellExecute
#include "string" //needed for std:string
#include <sys/stat.h> //need for stat in fileExists function below
#define DLL_FUNC extern "C" __declspec (dllexport)
__declspec(dllexport) ULONG __GetXpVersion() {
return ODS_VERSION;
}
bool fileExists(const std::string& filename) {
struct stat buf;
if (stat(filename.c_str(), &buf) != -1)
{ return true; }
return false;
}
DLL_FUNC int __stdcall RunPP() {
if (fileExists("C:\\FileOnServer\\execute.bat")) {
ShellExecute(NULL,TEXT("open"), TEXT("C:\\FileOnServer\\execute.bat"), NULL, NULL,SW_SHOWNORMAL);
return 0;
} else {
MessageBox(HWND_DESKTOP, TEXT("File not found."), TEXT("Message"), MB_OK);
return 1;
}
}
コマンド ラインからrundll32 ({コンマの後にスペースなし}) を使用してこの DLL をテストできることを知りましたがrundll32 yourdllname.dll,functionname
、プロジェクトに .def ファイルを含める場合に限られます。私のdefファイルは
LIBRARY
EXPORTS
RunPP
また、ドキュメントに記載されているように、[プロジェクト] > [プロパティ...] > [リンカー] > [入力] > [追加の依存関係] で Opends60.lib への参照を追加しようとしましたが、ある時点で削除されたようです。
私のような新参者のために、C/C++ > コード生成 > ランタイム ライブラリを /MD に切り替えるなど、プロジェクトのプロパティ ページで多くのことを学ばなければなりませんでした。また、リリース モードでコンパイルする方法、結果の .dll ファイルの場所なども学習します。
次に、コンパイルした DLL を SQL Server マシン (Win2003R2) に移動するときに、VC++ 2010 Redistributable をインストールして実行する必要がありました。次に、マシンの C:\Program Files\Microsoft SQL Server\MSSQL\Binn (xp_cmdShell 拡張ストアド プロシージャの DLL と同じ場所) に DLL をコピーし、ドキュメントに従って sp_addextendedproc を実行して、利用可能な拡張ストアとして登録しました。 master データベースのプロシージャ。次に、ユーザーがそれを実行する権限を付与します。
私はこれがすべて古い技術であることを知っています。SQL Server のバージョンをアップグレードする必要があります。しかし、多分これは他の誰かを助けるでしょう。