2013-06-18 7 views
0

Я создал dll C++/cli в visual studio 2010 с параметром CLR, как показано ниже, и создал файл email.dll. Затем проверить это создал еще один проект VS2010 win32 и пытался загрузить email.dll с помощью LoadLibrary, который alwyas возвращается NULL:LoadLibrary не загружается C++ CLI, созданный dll

HINSTANCE hGetProcIDDLL = LoadLibrary((LPCWSTR)"pathto\\email.dll");

Мой вопрос: Должен ли email.dll быть загружен каким-либо другим способом ? или если mail.dll создается правильно.

Код C++/CLI для email.cpp: Определяет экспортированные функции для приложения DLL.

#using <mscorlib.dll> 
#using <system.dll> 
include "stdafx.h" 
using namespace System; 

using namespace System::Net::Mail; 


extern int CallSendEmailFromGmail(char* fromEmail, char* password, char* toEmail, char* subject, char* message); 


extern "C" 
{ 
    __declspec(dllexport) int SendEmailFromGmail(char* fromEmail, char* password, char* toEmail, char* subject, char* message) 
    { 
     return CallSendEmailFromGmail(fromEmail, password, toEmail, subject, message); 
    } 

} 

int CallSendEmailFromGmail(char* fromEmail, char* password, char* toEmail, char* subject, char* message) 
{ 

     String ^from = gcnew String(fromEmail); 
     String ^pwd = gcnew String(password); 
     String ^to = gcnew String(toEmail); 
     String ^subjectStr = gcnew String(subject); 
     String ^messageStr = gcnew String(message); 
     SmtpClient ^client = gcnew SmtpClient(); 
// client->DeliveryMethod = SmtpDeliveryMethod.Network; 

     client->UseDefaultCredentials = false; 
     client->Credentials = gcnew System::Net::NetworkCredential(from, pwd); 
     client->Port = 587; 
     client->Host = "smtp.gmail.com"; 
     client->EnableSsl = true; 
     MailMessage ^mail = gcnew MailMessage(from, to); 
     mail->Subject = subjectStr; 
     mail->Body = messageStr; 
     try 
     { 
      client->Send(mail); 
     } 
     catch (Exception ^ex) 
     { 
      Console::WriteLine("Message : " + ex->Message); 
      return 1; 
     } 

     Console::WriteLine("Message : Done"); 
     return 0; 
} 
+2

Вам нужно будет отказаться от привычки использовать бросок, чтобы заставить компилятор прекратить сообщать вам, что вы сделали это неправильно. (LPCWSTR) останавливает компилятор от жалобы, это не мешает вам сделать это неправильно. Вы префикс строкового литерала с L, чтобы сделать его широкой строкой, например L "Это широкая строка". Использование LoadLibrary() также неверно, вы используете Assembly :: LoadFrom() для загрузки управляемой сборки. Для этого очень мало смысла, просто добавьте ссылку на сборку, чтобы CLR автоматически загрузила DLL для вас. –

+0

@HansPassant Он тестирует свою экспортированную точку входа функции. –

+0

Спасибо, Ханс и Том! – Suvesh

ответ

2

Когда функция API Win32 терпит неудачу, она обычно устанавливает код ошибки для потока. Итак, говоря, что функция возвращает NULL, недостаточно говорит. Документы LoadLibrary указывают на документы GetLastError.

Это, вероятно, что случилось:

LoadLibrary((LPCWSTR)"pathto\\email.dll"); 

Вы не можете бросить, чтобы изменить представление струны из пути к файлу. Кажется, у вас определен UNICODE, и это нормально; В конечном итоге вы вызовете LoadLibraryW вместо LoadLibraryA. Чтобы построить путь к файлу для LoadLibraryW, используйте:

LoadLibraryW(L"pathto\\email.dll"); 
+0

Согласен; Благодарю. В идеале мы будем использовать 'u 'путьto \\ email.dll", так как это именно то, что требует LoadLibraryW. Но сегодня это не поддерживается. –

+0

Спасибо, Очень понравилось! Я могу теперь вызывать экспортированную функцию с одним изменением в файле email.dll, которое окружает dllMain с неуправляемым #pragma и #pragma, поскольку проект тестирования построен без clr. – Suvesh

Смежные вопросы