Tôi đang cố gắng làm theo hướng dẫn trên trang web này: http://support.microsoft.com/kb/q168958
Mã này như sau:
#include
#include
Kiểm tra không gian tên {
mẫu lớp TestBuffer
{
private:
LOẠI* m_pData;
size_t m_uKích thước;
public:
TestBuffer(size_t uSize): m_pData(NULL), m_uSize(0)
{
m_pData = (TYPE*)malloc(uSize * sizeof(TYPE));
}
~TestBuffer() { if (NULL != m_pData) free(m_pData }
public:
bool IsValid() const { return NULL != m_pData }
toán tử TYPE*() const { return m_pData }
};
lớp mẫu __declspec(dllexport) Test::TestBuffer;
__declspec(dllexport) bool GetCurrentDir(char* szDir, size_t uSize)
{
DWORD dwRequiredSize = ::GetCurrentDirectoryW(0, NULL);
Test::TestBuffer wideCharBuffer(size_t(dwRequiredSize));
bool bResult = (dwRequiredSize - 1 ==
::GetCurrentDirectoryW(dwRequiredSize, (wchar_t*)wideCharBuffer));
wcstombs(szDir, (wchar_t*)wideCharBuffer, uSize);
trả về kết quả;
}
} // không gian tên Kiểm tra
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
char szPath[MAX_PATH] = { 0 };
Kiểm tra::GetCurrentDir(szPath, MAX_PATH);
return TRUE;
}
Đưa nó vào dự án WIN32 DLL trong VS sẽ gây ra lỗi sau:
lỗi LNK2019: ký hiệu bên ngoài chưa được giải quyết "class Test::TestBuffer __cdecl wideCharBuffer(unsigned int)" (?wideCharBuffer@@YA?AV?$TestBuffer@_W@Test@@I@Z) được tham chiếu trong hàm "bool __cdecl Test ::GetCurrentDir(char *,unsigned int)"
Tôi không chắc tại sao trình liên kết không thể tìm thấy định nghĩa vì mọi thứ đều được xác định ở đó, cùng với câu lệnh xuất cho TestBuffer. Ngoài ra, trong ví dụ này, tôi thậm chí không cần xuất một phiên bản rõ ràng của TestBuffer, vì nó không được hiển thị trong giao diện DLL, chỉ GetCurrentDir() mới có.
Bạn có đoán được tại sao mã không được tạo cho TestBuffer để trình liên kết có thể tìm thấy nó không?
Tái bút Đây là một ví dụ giả định để chứng minh sự cố chứ không phải mã sản xuất thực tế.
Trình biên dịch sẽ rộngCharBuffer
Một khai báo của được coi như một khai báo hàm (phân tích khó chịu nhất). Hãy thử thay đổi nó thành:
Test::TestBuffer wideCharBuffer((size_t(dwRequiredSize)));
Tôi là một lập trình viên xuất sắc, rất giỏi!