Strictly speaking, yes you can. There are a bunch of C Media Object APIs that take the key as a string (including the API listed below that straight up copies media objects from one GT struct/key to another), however, this would require the caller to correctly format the key string(s) for source and destination which could be a little bit of a pain for the caller.
<font class="small">Code:</font><hr /><pre>
KRNL_RTN(JDEDB_RESULT) JDEWINAPI JDEGTCopyF00165WithKeyStr(
PJSTR szFromObjName,
PJSTR pszFromGTKey,
int nFromSeq, MOTYPE nMOType,
PJSTR szToObjName,
PJSTR pszToGTKey);
</pre><hr />
If it were me, I might be inclined to create the copy routine as a private subroutine that uses:
<font class="small">Code:</font><hr /><pre>
KRNL_RTN(JDEDB_RESULT) JDEWINAPI JDEGTCopyF00165(
PJSTR szFromObjName,
LPVOID pFromMODSKey,
int nFromSeq, MOTYPE nMOType,
PJSTR szToObjName,
LPVOID pToMODSKey);
</pre><hr />
and then add public Functions for each individual case that take the actual data elements of the of the key to hide all that from the caller (the code for each of these public functions would be small and trivial). Example public function sig:
<font class="small">Code:</font><hr /><pre>
CopyMOSalesOrderToPurchaseOrder
szSoOrderCompany
szSoOrderType
mnSoOrderNumber
szPoOrderCompany
szPoOrderType
mnPoOrderNumber
</pre><hr />
In this way, you let JDE handle creating the Key String from the GT data structure instead of having to manually create it yourself and risk errors. Honestly, once the first Public function is created, creating additional ones would be pretty easy, someone that doesn't even know C could probably figure out how to copy code from an existing public Function to a new one.