1

我正在使用 SQL2012 和 VS2012。

我想实现这个解决方案来查看文件的日期和时间戳,当触发 SQL 表上的触发器时,这些日期和时间戳由 dll 更新。

这就是我想要做的。

其中引用了一篇 MSDN 文章

我已按照说明进行操作,但得到了这个:

Msg 17750, Level 16, State 0, Procedure xsp_UpdateSignalFile, Line 1
Could not load the DLL XSP.dll, or one of the DLLs it references. Reason: 193(%1 is not a valid Win32 application.).

我假设是因为我使用的是 SQL2012 64 位。

我下载了 XSP.DLL 源代码并在 VS2012 中查看,但无法编译它,即使在找到自己的opends60.lib副本后也是如此

Error 4    error LNK2019: unresolved external symbol _srv_rpcparams referenced in function _xsp_UpdateSignalFile     C:\Users\Administrator\Documents\xsp.dll\WickedCode0304\XSP\XSP.obj  XSP

C++ 向导可以帮助我将其编译为 64 位还是我之前出错了?

它是说它无法解决一些收到的参数?

.cpp 文件如下所示:

#include <windows.h>
#include <srv.h>

///////////////////////////////////////////////////////////////////////
// Entry point

extern "C" BOOL WINAPI DllMain (HINSTANCE hInstance, DWORD dwReason,
    LPVOID lpReserved)
{
    return TRUE;
}

///////////////////////////////////////////////////////////////////////
// Exported functions

extern "C" __declspec (dllexport)
ULONG __GetXpVersion ()
{
   return ODS_VERSION;
}

extern "C" __declspec (dllexport)
SRVRETCODE xsp_UpdateSignalFile (SRV_PROC *srvproc)
{
    //
    // Make sure an input parameter is present.
    //
    if (srv_rpcparams (srvproc) == 0)
        return -1;

    //
    // Extract the file name from the input parameter.
    //
    BYTE bType;
    char file[256];
    ULONG ulMaxLen = sizeof (file);
    ULONG ulActualLen;
    BOOL fNull;

    if (srv_paraminfo (srvproc, 1, &bType, &ulMaxLen, &ulActualLen,
        (BYTE*) file, &fNull) == FAIL)
        return -1;

    if (bType != SRVBIGCHAR && bType != SRVBIGVARCHAR)
        return -1;

    file[ulActualLen] = 0;

    //
    // Update the file's time stamp.
    //
    char path[288] = "C:\\AspNetSql\\";
    lstrcat (path, file);

    HANDLE hFile = CreateFile (path, GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile != INVALID_HANDLE_VALUE)
        CloseHandle (hFile);

    return 0;
}
4

1 回答 1

0

我使用在 Win 7 Pro 64 位上运行的 SQL Server 2008 SP3 Dev 64 位和 VS 2012 Ultimate 来完成这项工作。这是我所做的:

  1. Empty Project从 VS 中的模板创建一个新的VC++并添加一个空的 C++ 文件。
  2. 将平台更改x64Configuration manager.
  3. 将 更改Configuration TypeDynamic library (.dll)Configuration Properties/General
  4. 安装了SQL x64 本机客户端,包括SQL Server Native Client SDK获取opends60.lib. 我不确定 SDK 组件是否真的需要。
  5. 添加C:\Program Files\Microsoft SQL Server\90\SDK\Lib\x64Additional library directories链接器选项中。这是安装了本机客户端。
  6. 添加opends60.libAdditional dependencies链接器选项中。
  7. 编译无误。
  8. 创建了XSP.dll使用的输出目录:C:\AspNetSql\.
  9. 复制XSP.dll到第 8 步中创建的目录。
  10. 使用以下方法安装了扩展存储过程:

    USE master
    EXEC sp_addextendedproc 'xsp_UpdateSignalFile', 'C:\AspNetSql\XSP.dll'
    GRANT EXECUTE ON xsp_UpdateSignalFile TO PUBLIC

  11. 使用执行它master..xsp_UpdateSignalFile 'Quotes.Quotations'并通过确认文件Quotes.Quotations是在输出目录中创建的来验证它是否有效。

如果您对任何步骤有任何疑问或想要澄清,我可以添加屏幕截图或提供更多信息。

于 2013-11-13T11:02:04.657 回答