0

DLL には通常、変数を格納する独自のヒープがあることを理解しています。私の DLL 関数は wchar_t 変数へのポインターを受け取り、それに値を入れようとすると、単純に関数を終了し、ポインターを指すポインターを残します。私が想定している悪い場所は、ヒープが破壊されるためです。

私の DLL 関数が何らかのデータを返す必要がある場合、誰かがそのデータを文字列形式で元のメイン関数に戻す方法の例を教えてもらえますか?

Visual Studio 2010 を使用しています。

編集:いくつかのサンプルコードを提供できますが、dllとその機能に関してメモリがどのように処理されるかについて例/説明を求めているだけなので、要点がわかりませんでした。必要な情報をお尋ねください。お届けできるよう努めます。

アプリケーションが何をするかを理解してもらうために、これは COM サーバー DLL です。インターフェイスは IProperty で、オブジェクトは PropertyObject と呼ばれます。DLL は、PropertyObject メソッドを使用して、私が個別にビルドしました。この Getproperty メソッドは、私が取り組んでいるものです。

STDMETHODIMP PropertyObject::GetProperty(int arg1, wchar_t* arg2)
{
    arg2 = L"Test";
    cout << *arg2 << endl;
    return S_OK;
}

int main()
{

CoInitialize(NULL);

IClassFactory * pClassFactory = NULL;
HRESULT hr;
hr  = CoGetClassObject(
CLSID_PropertyObject,
CLSCTX_SERVER,
NULL,
IID_IClassFactory,
(void **) &pClassFactory);

if (SUCCEEDED(hr))
{
    wchar_t x = NULL;
    IProperty *pProperty = NULL;

    hr = pClassFactory->CreateInstance(NULL, IID_IProperty, (void **) &pProperty);
    hr = pProperty->GetProperty(2, &x);
    cout << x << endl;
}
    return 0;
}
4

2 に答える 2

0

通常の文字配列のような wchar_t ポインターをまだ検討していたことがわかりました。ここに私の改訂されたコードがあります:

STDMETHODIMP PropertyObject::GetProperty(int arg1, wchar_t* arg2)
{
    wcscpy(arg2, L"Test"); // This is the function that i needed to be using. 
    return S_OK;
}



int main()
{
    CoInitialize(NULL);

IClassFactory * pClassFactory = NULL;
HRESULT hr;
hr  = CoGetClassObject(
CLSID_PropertyObject,
CLSCTX_SERVER,
NULL,
IID_IClassFactory,
(void **) &pClassFactory);

if (SUCCEEDED(hr))
{
    wchar_t *x = new wchar_t; // Before, this was a normal variable. Changed it to a pointer. 
    IProperty *pProperty = NULL;

    hr = pClassFactory->CreateInstance(NULL, IID_IProperty, (void **) &pProperty);
    hr = pProperty->GetProperty(2, x); // Passed the pointer instead of an address to a normal variable. 
    wcout << x << endl; // wcout instead of cout. It worked. 
}
    return 0;
}
于 2013-03-12T18:27:15.887 に答える
0

参加しているすべてのプログラムが同じバージョンの Visual Studio でコンパイルされているという事実が 100% 確実な場合 (つまり、すべてのプログラムが std::string が含まれる同じバージョンの STL を使用していることを意味します)、次の std を使用できます。 :文字列クラス。

相互運用性が必要な場合、最善の策は、char* と長さを渡し、その提供されたバッファーに書き込むことです。呼び出し元にメモリを処理させます。これはかなり C スタイルですが、最も安全な方法でもあります。

于 2013-03-12T16:53:01.153 に答える